requests爬取唯美女孩图片
一、前言
最近学习爬虫,都是跟着教程做的,如今想摆脱教程,独立完成一个爬虫小项目,故作此文,总结项目过程中遇到的问题和解决方法。
二、实现项目
1.分析网页
首先打开目标网站,本次项目以 唯美女生 | 一双发现美的眼睛! 为目标,爬取其中的图片。我们打开网页,首先要右键鼠标检查源码,此时问题出现了,右键鼠标怎么都按不出来,更别说检查网页源代码了。因为这个网站有个阻止我们使用F12功能的js文件 disable-devtool.min.js。怎么解决呢,也简单,提前打开F12再进入目标网站即可。
打开网站后,我们发现该网站是使用AJAX动态加载数据的。
那么我们在F12下的network选项卡里,切换到XHR,查找可能存在数据的AJAX请求。
在众多AJAX中,我们找到了admin-ajax.php,这个请求包含了我们需要的数据,打开预览可以看到请求到的数据。
请求找到了,接下来我们分析一下这个请求,切换回标头选项卡,我们发现该请求的链接是https://www.vmgirls.com/wp-admin/admin-ajax.php, 而请求方式是POST。
既然请求方式是POST,那么肯定有一个表单数据会跟随提交,否则访问不到数据。比如我们直接在浏览器新的窗口打开该链接,会出现以下情况。
我们继续在表头选项卡下,找到该请求需要携带的参数如下
append,paged,action,query,page
通过分析多个请求,我们发现只有paged在变化,该参数代表我们请求的页码。
至此网页分析完毕,进入代码爬取环节。
2.爬取网页
2-1、模拟POST请求
首先模拟该Ajax请求。我们传入参数page来表示爬取的页码:
post_url = 'https://www.vmgirls.com/wp-admin/admin-ajax.php'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.75'
}
def get_article_url(page):
data = {
'append': 'list-home',
'paged': page,
'action': 'ajax_load_posts',
'query': '',
'page': 'home'
}
resp = requests.post(url=post_url, data=data, headers=headers)
2-2、解析图集列表页面
请求到页面后,我们发现每一个图集的链接都是存在与以下路径:
因此这一步我们要获取该页面下所有的图集链接,我们使用xpath来解析网页。
text = resp.text
html = etree.HTML(text)
items = html.xpath('.//div[@class="col-6 col-md-3 d-flex py-2 py-md-3"]')
for item in items:
ar_url = item.xpath('.//div[@class="list-body"]/a/@href')[0]
parse_img_page(ar_url)
time.sleep(1