Python 使用requests-html 进行爬虫
介绍:
Requsts库,里面是一个用来模拟发送HTTP请求的第三方Python 库。常用来做爬虫或接口测试,相对于urllib 等系统库,requests具有简洁方便和高效等特点。
而Requests-HTML 对PyQuery、Requests、lxml、beautifulsoup4等库进行了二次封装,添加了解析 HTML 的接口,是一个 Python 的 HTML 解析库。
GiHub项目地址:
https://github.com/kennethreitz/requests-html
中文文档:
https://cncert.github.io/requests-html-doc-cn/#/
学习
预备知识
- Python 基础,了解第三方库的安装与导入,基础代码逻辑
- HTML 基础,了解前端网页各标签及其含义
安装
pip install requests-html
元素定位
对美桌网进行爬取图片
首先打开美桌网,使用F12或者鼠标右键查看源代码及元素属性。
我们要对该页面展示的图片进行爬取,那么需要对元素进行定位:


进行分析,发现所有的图片都是使用<li> </li>标签展示的,而 <li></li> 标签的父节点 <ul class="clearfix"> 是当前页面唯一属性,那么可以使用Xpath进行定位
xpath("//ul[@class='clearfix']/li[{}]/a/@href".format(n))[1]
- n为
<ul class="clearfix">节点下的第n个<li></li>标签- @href则为a标签的href属性,即跳转链接(原图网页)
- “1”是因为获取到的是一个list,我们需要的链接就是list[1]
requests-html
requests-html 和 requests 发送http请求基本相同。
from requests_html import HTMLSession
session = HTMLSession()
url = "http://www.win4000.com/wallpaper_2358_0_10_1.html"
req = session.get(url)
print(req)
print(req.html)
print(req.html.html)
对象req 是requests.Reponse类型,更确切的说是继承自前者的requests_html.HTMLResponse类型。这里其实和requests库的使用方法差不多,获取到的响应对象其实其实也没啥用,这里的关键就在于 r.html 这个属性,它会返回 requests_html.HTML 这个类型,它是整个requests_html库中最核心的一个类,负责对HTML进行解析。我们学习requests_html这个库,其实也就是学习这个HTML类的使用方法。
在IDE里面结果如下:
<Response [200]> #打印状态码
<HTML url='http://www.win4000.com/wallpaper_2358_0_10_1.html'> #打印url
<html> #打印页面的源码
***
</html>
由于采用 beautifulsoup4 的二次封装, 使用 requests_html 的最主要目的还是用来解析HTML网页。
使用Xpath定位刚才选择的图片的原图位置:
img_link = (req.html.xpath("//ul[@class='clearfix']/li[{}]/a/@href".format(1))[1])
pring(img_link)
我们打印得到的链接,使用浏览器打开,发现果然是我们需要的原图,继续F12调试:

找到了图片的<img> 标签 src 属性,使用requests_html库的xpath定位:
img = (req.html.xpath("//div[@class='pic-meinv']/a/img/@src"))[0] #图片链接
tit = (req.html.xpath("//div[@class='pic-meinv']/a/img/@alt"))[0] #图片说明
这样我们就成功爬取到了图片,只需要保存进本地就可以。
def save_image(url, title):
img_response = session.get(url)
with open('./img/'+title+'.jpg', 'wb') as file:
file.write(img_response.content)
这样我们就通过requests-html爬取了美桌网的图片,如果需要大量爬取的话,只需要写一个main函数,里面循环进行获取图片的原图网页,然后通过原图网页获取原图链接,再通过 file.write写进本地即可。
注意:
网页爬虫需遵循robots协议,部分网站存在反爬机制,可能需要在session中携带 cookies 或 heards。
