Advertisement

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。

全部评论 (0)

还没有任何评论哟~