A. 【爬虫】python 解决网页内容 和 爬取的内容不一致
我们使用 request 模块获取网页内容的时候,有时候会发现获取的网页内容和网页上不一样,
有些数据并非服务端渲染,而是通过后来加载的数据,某些网站重要的数据会通过Ajax后期加载,
这就分异步传输和异步加载俩个概念。
异步传输模式下,通常在JavaScript中,我们依次检查JavaScript,就会找到真正的网址!
异步加载则是在XHR的选项中获取真实网站地址:
举例豆瓣的影片获取信息:
页面上的内容可以看到,但是爬下来之后却没有:
XHR获取网页加载的内容:
分别检查左边5条记录,就可以看到真实的我们想要的内容。
B. 如何使用python或R抓取网页被隐藏的源代码
隐藏的源代码?不知道你指的是什么?我的理解有两种,一是不在前段显示,但是查看源代码时有,二是,异步加载的内容在前端和源代码中均看不到,第一种很容易解决,想必你指的时第二种,解决方法有三种:
模拟浏览器,动态获取,可以使用大杀器selenium工具
使用这种方法可以实现只要能看到就能抓取到,如鼠标滑过,异步加载等,因为他的行为可以与浏览器一模一样,但是这种方式的效率却是最低的,一般不到实在没有办法的时候不推荐使用。
执行js代码
在python中执行异步加载的js代码,获得一些诸如鼠标滑过,下拉加载更多等,但是现在的网站中都有非常多的js代码,要找到需要执行的目标js代码时非常困难和耗时的,此外python对js的兼容性也不是很好,也不推荐使用。
找到异步加载的json文件,最常用,最方便,最好用的方法,这是我平常抓取动态异步加载网站时最常用的方法,可以解决我99%的问题。具体的使用方法是打开浏览器的开发者工具,转到network选项,之后重新加载网页,在network中的列表中找到加载过程中加载的需要动态异步加载的json文件,以京东为例,如图,第一张找到的是异步加载的库存信息的json文件,第二招找到的是异步加载的评论信息的json文件:
具体更详细的方法可以google或网络
C. 如何抓取网页中异步加载的数据
用前嗅的ForeSpider数据采集软件可以抓取JS、AJAX生成的网页。ForeSpider爬虫是通用性的采集软件,自带一种爬虫脚本语言,不管是如何复杂的JS网页,如果可视化的配置方式采集不到,都可以写脚本采集的到,比python、Java要容易的多,因为是专用的爬虫脚本语言,所以简单几句话就可以实现强大的功能。
有免费版可以下载,免费版不限制功能。还要好多免费的模板可以下载使用,可以试一下。
D. 如何处理python爬虫中的异步加载
正常使用scrapy或goose等模块时加载的爬虫本身就是异步的。
就算你多只爬虫“同时”启动,“同时”只是对于你人眼睛而言 与远端也是异步的。
E. 如何用Python爬虫抓取网页内容
首先,你要安装requests和BeautifulSoup4,然后执行如下代码.
importrequests
frombs4importBeautifulSoup
iurl='http://news.sina.com.cn/c/nd/2017-08-03/doc-ifyitapp0128744.shtml'
res=requests.get(iurl)
res.encoding='utf-8'
#print(len(res.text))
soup=BeautifulSoup(res.text,'html.parser')
#标题
H1=soup.select('#artibodyTitle')[0].text
#来源
time_source=soup.select('.time-source')[0].text
#来源
origin=soup.select('#artibodyp')[0].text.strip()
#原标题
oriTitle=soup.select('#artibodyp')[1].text.strip()
#内容
raw_content=soup.select('#artibodyp')[2:19]
content=[]
forparagraphinraw_content:
content.append(paragraph.text.strip())
'@'.join(content)
#责任编辑
ae=soup.select('.article-editor')[0].text
这样就可以了
F. 如何用python抓取这个网页的内容
如果包含动态内容可以考虑使用Selenium浏览器自动化测试框架,当然找人有偿服务也可以
G. Python网页解析库:用requests-html爬取网页
Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库,最近用 Xpath 用得比较多,使用 BeautifulSoup 就不大习惯,很久之前就知道 Reitz 大神出了一个叫 Requests-HTML 的库,一直没有兴趣看,这回可算歹着机会用一下了。
使用 pip install requests-html 安装,上手和 Reitz 的其他库一样,轻松简单:
这个库是在 requests 库上实现的,r 得到的结果是 Response 对象下面的一个子类,多个一个 html 的属性。所以 requests 库的响应对象可以进行什么操作,这个 r 也都可以。如果需要解析网页,直接获取响应对象的 html 属性:
不得不膜拜 Reitz 大神太会组装技术了。实际上 HTMLSession 是继承自 requests.Session 这个核心类,然后将 requests.Session 类里的 requests 方法改写,返回自己的一个 HTMLResponse 对象,这个类又是继承自 requests.Response,只是多加了一个 _from_response 的方法来构造实例:
之后在 HTMLResponse 里定义属性方法 html,就可以通过 html 属性访问了,实现也就是组装 PyQuery 来干。核心的解析类也大多是使用 PyQuery 和 lxml 来做解析,简化了名称,挺讨巧的。
元素定位可以选择两种方式:
方法名非常简单,符合 Python 优雅的风格,这里不妨对这两种方式简单的说明:
定位到元素以后势必要获取元素里面的内容和属性相关数据,获取文本:
获取元素的属性:
还可以通过模式来匹配对应的内容:
这个功能看起来比较鸡肋,可以深入研究优化一下,说不定能在 github 上混个提交。
除了一些基础操作,这个库还提供了一些人性化的操作。比如一键获取网页的所有超链接,这对于整站爬虫应该是个福音,URL 管理比较方便:
内容页面通常都是分页的,一次抓取不了太多,这个库可以获取分页信息:
结果如下:
通过迭代器实现了智能发现分页,这个迭代器里面会用一个叫 _next 的方法,贴一段源码感受下:
通过查找 a 标签里面是否含有指定的文本来判断是不是有下一页,通常我们的下一页都会通过 下一页 或者 加载更多 来引导,他就是利用这个标志来进行判断。默认的以列表形式存在全局: ['next','more','older'] 。我个人认为这种方式非常不灵活,几乎没有扩展性。 感兴趣的可以往 github 上提交代码优化。
也许是考虑到了现在 js 的一些异步加载,这个库支持 js 运行时,官方说明如下:
使用非常简单,直接调用以下方法:
第一次使用的时候会下载 Chromium,不过国内你懂的,自己想办法去下吧,就不要等它自己下载了。render 函数可以使用 js 脚本来操作页面,滚动操作单独做了参数。这对于上拉加载等新式页面是非常友好的。
H. 从零开始学Python-使用Selenium抓取动态网页数据
AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。
因为传统的网页在传输数据格式方面,使用的是 XML 语法,因此叫做 AJAX ,其实现在数据交互基本上都是使用 JSON 。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在 右键->查看网页源代码 还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。
法1:直接分析ajax调用的接口。然后通过代码请求这个接口。
法2:使用Selenium+chromedriver模拟浏览器行为获取数据。
Selenium 相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。 chromedriver 是一个驱动 Chrome 浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
现在以一个简单的获取网络首页的例子来讲下 Selenium 和 chromedriver 如何快速入门:
参考:Selenium的使用
直接直接分析ajax调用的接口爬取
selenium结合lxml爬取
I. 如何用Python爬取动态加载的网页数据
动态网页抓取都是典型的办法
直接查看动态网页的加载规则。如果是ajax,则将ajax请求找出来给python。 如果是js去处后生成的URL。就要阅读JS,搞清楚规则。再让python生成URL。这就是常用办法
办法2,使用python调用webkit内核的,IE内核,或者是firefox内核的浏览器。然后将浏览结果保存下来。通常可以使用浏览器测试框架。它们内置了这些功能
办法3,通过http proxy,抓取内容并进行组装。甚至可以嵌入自己的js脚本进行hook. 这个方法通常用于系统的反向工程软件
J. python怎么抓取渲染后的页面
应该是没法抓取渲染后的页面。
因为渲染这个工作是浏览器完成的。而你通过python脚本抓取到的内容仅仅是html、css、js等源码。
对于一些需要js异步加载的内容获取,通常是先获取相关源码,然后参考js源码,利用python伪造一个请求(带上所需的参数)再向服务器获取一次内容。
动态内容的爬取,也是爬虫面临的一个比较大的难题。很多动态请求 事实上并不是那么容易伪造的。