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 脚本来 *** 作页面,滚动 *** 作单独做了参数。这对于上拉加载等新式页面是非常友好的。
一直都觉得微信公众号是爬虫的理想对象,获取到的对象url在手机上展示非常的赞,广告排版都在能接受的范围内,正好最近2练手python爬虫,果断的上了。首先分析一下搜狗微信公众号的手机端:
这里的请求非常简单 分析之后可以发现基本就是:
url='http://weixin.sogou.com/wapindex/wap/0612/wap_9/%d.html'%i
变换的也就是后面的数字
然后正常使用requests去请求:
response=requests.get(url,headers=mergedHeaders)
然后就乱码了,这里我尝试了很多解码方式,但是都解决不了,当然最后折腾了好久之后发现是html的gzip压缩问题,在网络上查询基本都是urllib2的解决办法
重新查询requests的官方文档发现了我需要的:
很明显,这里说了使用response.content方法
Requests会自动解码gzip,不过返回的是byte内容,所以我们只需要将byte to String 就可以了,好,尝试一下
转换方法:
def byteToString(byteData):
'''
将byte转化为String
:parambyteData:
:return: String
'''
returnBytesIO(byteData).read().decode()
然后请求内容:
response=requests.get(url,headers=mergedHeaders)
ifresponse.headers['Content-Encoding']=='gzip':
result=BytesIO(response.content).read().decode()
returnresult
else:
returnresponse.text
问题解决
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理python2
爬虫:从网页上采取数据
爬虫模块:urllib,urllib2,re,bs4,requests,scrapy,xlml
1.urllib
2.request
3.bs4
4.正则re
5种数据类型
(1)数字Number
(2)字符串String
(3)列表List[] 中文在可迭代对象就是unicode对象
(4)元组Tuple()
(5)字典Set{}
爬虫思路:
1.静态 urlopen打开网页------获取源码read
2.requests(模块) get/post请求----获取源码 text()方法 content()方法(建议)
3.bs4 能够解析HTML和XML
-- coding:utf-8 –
from bs4 import BeautifulSoup
1
html=“
2018.1.8 14:03
”
soup=BeautifulSoup(html,‘html.parser’) #解析网页
print soup.div
2从文件中读取
html=’’
soup=BeautifulSoup(open(‘index.html’),‘html.parser’)
print soup.prettify()
4.获取所需信息
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)