开发环境:
①Python3.8.5
②Pycharm-community-2020.2
③GoogleChrome 84.0.4147.135
④XPath Helper 2.0.2
目标网址:【美桌网cosplay图片大全】http://www.win4000.com/meinvtag26_1.html
可以看到这个cosplay大全一共有5页,我们需要将每页的每个相册里的所有图片都爬取下来。
整个爬取过程可以分为如下四步:1.分析网页性质2.发送网络请求3.解析数据(筛选数据)4.将数据保存至本地。
实验过程:
- 打开目标网址后,我们发现url地址栏中下划线后面的数字表示这是该cosplay大全的第几页。
- 在浏览器中选中相册右键选择检查,可以看到该模块对应的前端代码,我们的目标就是获取黄色方框的url地址,也就是每个相册所在的网页地址。于是我们可以使用XPath插件通过标签去一步步定位,可以看到results结果集里有24条数据,刚好对应每页24个相册。
对应的xpath为:
//div[@class=”list_cont Left_list_cont Left_list_cont2”]//div[@class=”tab_tj”]//ul/li/a/@href
- 进入相册后,我们发现url地址栏中下划线后面的数字表示这是该相册的第几张图片。
- 右键检查图片,data-original后面的url地址即是我们最终需要的图片地址,可通过该地址下载图片。
对应的xpath为:
//div[@class=”pic-meinv”]/a/img/@data-original
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| import requests import parsel import time from datetime import datetime
for page in range(1, 6): url = 'http://www.win4000.com/meinvtag26_{}.html'.format(str(page)) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'}
response = requests.get(url=url, headers=headers).text
selector = parsel.Selector(response) album_list = selector.xpath('//div[@class="list_cont Left_list_cont Left_list_cont2"]//div[@class="tab_tj"]//ul/li/a/@href').getall()
for album_url in album_list: for num in range(1, 20): picture_url = album_url.split('.')[0] + '.' + album_url.split('.')[1] + '.' + album_url.split('.')[2] + '_' + str(num) + '.' + album_url.split('.')[3] response_2 = requests.get(url=picture_url, headers=headers).text selector_2 = parsel.Selector(response_2)
imgPath = selector_2.xpath('//div[@class="pic-meinv"]/a/img/@data-original').get()
if not imgPath is None: img_data = requests.get(url=imgPath, headers=headers).content
file_name = datetime.now().strftime("%Y%m%d-%H%M%S") + '.jpg'
with open("img\\" + file_name, mode='wb') as f: f.write(img_data) print("保存完成:" + file_name) time.sleep(1)
|
运行结果: