网络爬虫系列
上篇回顾
- 在上篇讲述了网络爬虫爬取某个网页上的图片,我们实现的是具有Img标签的所有href进行爬取。但是,一个网站不可能只有一个页面有图片,我们爬取图片也不是只爬取一个页面的图片,这时如果我们需要爬取某个网站上的多页图片时,就需要对上篇代码进行改进了。
怎么实现分页爬取呢?
- 还是以ZOL桌面壁纸这个网站为例,打开网站我们发现下面有上一页、1、2、3、4、5、下一页等链接可以点击,所以在改进代码时,就是对这几个链接左处理了。
- 当我们点击每页时可以找到URL的一些规律:
- 可以发现每一页变得是/2、/3、/4。所以对此我们可以在代码中加一个for循环,使循环的最大值小于网站page的最大值,从第一页开始爬取图片,但是这种方法不太好,因为网站是动态的,不可能最大page一直不变,我们也不可能每次来爬取的时候先进网站找最大页面值,所以必须找一种就算网站更新了,还是可以从第一页开始到最后一页结束为止,把所有图片都爬取完的方法。
- 右键审查,选择下一页图标,在Element中查看html格式。
可以发现下一页有个id="pageNext"的属性,所以我们可以在翻页时判断页面a标签中是否有
id = "pageNext"
如果有就做while循环直到最后一页为止,这样就实现了自动翻页的功能了。
实现思路
- 每翻一页,就把页面上的img下载。
def download_img(url):
imgname = url.split('/')[-1]
img = requests.get(url, headers = headers)
with open('imgs1/'+imgname,'wb') as file:
file.write(img.content)
print(url, imgname)
- 判断是否有‘’下一页‘’这个标签,如果有就把页面的图片下载到指定文件夹下并且返回下一页的URL,没有则返回null。
def next_page(url):
res = requests.get(url, headers = headers)
html = etree.HTML(res.text)
srcs = html.xpath(".//img/@src")
for i in srcs:
download_img(i)
next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
return next_page_link
- mian函数通过while循环来判断是否有下一页,如果有current_page加一,没有了就执行完成,即到了尾页,这里由于是演示,就在代码中加了一个限定,只下载10页以前的图片。
def main():
current_page = 1
next_page_base = 'http://desk.zol.com.cn/dongman/1920x1080/'
next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
while next_page_link:
current_page=current_page + 1
next_page_link = next_page(next_page_base+str(current_page)+'.html')
if current_page > 10:
break
- 注意在首页的url为http://desk.zol.com.cn/dongman/1920x1080/与后面的页面不一样,所有在while循环之前先将首页的Img下载下来。
代码部分:
import requests
import time
from lxml import etree
url = 'http://desk.zol.com.cn/dongman/1920x1080/'
headers = {"Referer":"Referer: http://desk.zol.com.cn/dongman/1920x1080/",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",}
resq = requests.get(url,headers = headers)
print(resq)
html = etree.HTML(resq.text)
srcs = html.xpath(".//img/@src")
def download_img(url):
imgname = url.split('/')[-1]
img = requests.get(url, headers = headers)
with open('imgs1/'+imgname,'wb') as file:
file.write(img.content)
print(url, imgname)
def next_page(url):
res = requests.get(url, headers = headers)
html = etree.HTML(res.text)
srcs = html.xpath(".//img/@src")
for i in srcs:
download_img(i)
next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
return next_page_link
def main():
current_page = 1
next_page_base = 'http://desk.zol.com.cn/dongman/1920x1080/'
next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
while next_page_link:
current_page=current_page + 1
next_page_link = next_page(next_page_base+str(current_page)+'.html')
if current_page > 10:
break
if __name__ == '__main__':
main()
执行结果
- 运行成功,正在下载图片
- 打开文件夹,查看下载的图片