这几天,一直在研究爬取图片的方法,今天终于有了成效,赶紧发文纪念一波。
这次,我选择的是三个库联合爬取,我觉得这样可能效果会更好一点。安装selenium库和requests库的方法,我之前的博文有说,需要的同志可以参见我前面写的博文,自行安装和下载,当然,安装过程中遇到困难,也可以与我私聊探讨,我很乐意帮助你。
这次,我们的案例网址是:https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4。
完整代码:
from lxml import etree
from selenium import webdriver
import time
import urllib.request
import requests
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
url = 'https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4'
driver.get(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
html = driver.page_source
select = etree.HTML(html)
for i in range(1,21):
xpath_road = '//*[@id="subject_list"]/ul/li['+str(i)+']/div[1]/a/img/@src'
img_href = select.xpath(xpath_road)
#print(img_href)
for e in img_href:
print(e)
img = requests.get(e,headers=headers)
with open('img{}.jpg'.format(i),'wb+') as f:
f.write(img.content)
time.sleep(1.5)
我们捋一下思路,想要爬取图片,我们就得先获得它的链接地址,然后,对图片的链接地址进行请求,再以二进制的形式写入图片文件,最后,保存到本地计算机上,这就是整个的流程。此次,我们要爬取的内容如下图,左侧红框中的图书图片:
首先,我们导入可能需要用到的库,如下图:
接着,我们开启万花筒模式(无头模式),代码如下图:
然后,请求网页:
之后,设置请求报头:
接着,我们用driver函数page_source()获取当前页面的源代码,再将获取的源代码传递给etree的函数HTML,创建xpath选择器select。
然后,我们去观察一下网页结构,分析一下:
图片在标签img里面,所以,我们接着就要提取对应的xpath路径。所以有:
我们如果翻到这一页的最后一张图图片,我们会根据xpath路径得出一个规律:
随着图片往下走,变动的仅仅只是li标签的序号,其他的内容没有变动。所以,我们使用for循环,构造li标签的序号,又因为我们提取的图片链接在属性src中,所以,我们要匹配属性src,所以有:
这里的图片链接是用xpath方法提取的,所以是以列表形式返回提取结果。因此,我们要循环,把链接打印出来,所以有:
运行结果:
当然了,我们还差最后一步,就是把图片保存到本地计算机中,请求图片的链接地址,然后,以二进制的形式写入图片文件中,我们的图片不能重名,用格式化字符串的方法,将对应图片的循环次数作为图片名,避免重名,所以有:
运行结果,我们去对应的编辑器文件夹(目录)下面找到爬取下来的图书图片:
在pycharm编辑器中也可以看见,如下图:
直接打开图片,效果如下:
在pycharm编辑器中打开,效果如下:
后面还有很多图片,我就不全部截图了,请大家见谅。
最后,感谢大家前来观看鄙人的文章,文中或有诸多不妥之处,还望指出和海涵。搞了半个上午加一个下午的时间,终于懂了爬取图片的方法,过瘾,有点困了,先睡一波觉,再起来接着搞。