图片爬虫实战
假如我们想把jd商城的商品图片下载到本地,通过手工复制粘贴将是一份非常庞大的工程,此时,可以用Python网络爬虫实现。我们可以通过Python网络爬虫将这些网页上的图片全部爬取到本地,这类爬虫称为图片爬虫。
首先打开jd商城的首页,在搜索输入框中输入想要爬取的商品,例如:裤子。如下图所示:
再查看该网页的网址,该网址就是我们需要爬取的起始页面,如下图所示:
一、导入模块
import re
from urllib import request as req
from urllib import parse as pa
二、主函数
if __name__=="__main__":
key = input("请输入关键字:")
wd = {'keyword': key}
keyword = pa.urlencode(wd)
controllspider('https://search.jd.com/Search?'+keyword+'&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E8%A3%A4%E5%AD%90')
key:即我们需要下载图片的商品名称
urlencode():urllib库里的parse模块,对关键字进行编码
controllspider:爬虫控制器,负责整个爬取过程的调度
三、爬虫控制器
def controllspider(url):
'''
功能:爬虫的控制器,负责整个爬取过程的调度
:param url:初始爬取的url
:return:
'''
# 爬虫控制开关
flag = True
page = 1
while flag:
flag = False
print("\n\n\n")
print("--------------------------------------正在爬取第%s页-------------------------------------------------------"%page)
urls= url+'&page='+str(page)
product_list=spider(urls)
downloadimg(product_list)
control_input = input("是否继续?(按enter继续,Q退出)")
if control_input != 'Q':
flag = True
page += 1
爬取过程中,可进行交互功能,由用户决定是否继续爬取。
控制器(controllspider)将需要爬取的URL链接交给爬虫(spider),爬虫(spider)返回图片链接的集合。
控制器(controllspider)再将返回的图片链接集合交给下载器(downloadimg),将图片下载至本地。
控制器(controllspider)会判断是否满足停止条件。
四、爬虫spider
def spider(url):
'''
功能:获取图片链接
:param url: 待爬取的网页url链接
:return: 返回该页所有的商品图片的链接
'''
headers={'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'}
request=req.Request(url,headers=headers)
html=req.urlopen(request)
html=str(html.read())
print(url)
#pattern1='<li class="gl-item">.*? </li>'
pattern1 = 'class="gl-item".*?</li>'
results1=re.compile(pattern1).findall(html)
print(results1)
product_list=[]
for result in results1:
product_dict = {}
pattern2='//img.*?"'
imageurl=re.compile(pattern2).findall(result)
product_dict['imageurl'] = imageurl
product_list.append(product_dict)
return product_list
headers :在使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设置,而如果网站有反爬虫的话会拒绝这样的连接,因此修改headers可以将自己的爬虫脚本伪装成浏览器的正常访问。
re正则的使用:调用urlopen函数,返回HTML内容,调用**str(html)**函数将其转换为字符串。结合我上一篇的正则表达式用法,将字符串里面的所有图片链接URL匹配完成,返回URL集合。
五、下载器
def downloadimg(product_list):
'''
功能:根据URL下载图片
:param product_list: 图片URL集合
:return:
'''
for product in product_list:
imageurl = product['imageurl']
imageurl = imageurl[0].replace('"', '')
imageurl = "http:" + imageurl
print(imageurl)
filename='image\\'+str(imageurl)[-20:]
headers={'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'}
request=req.Request(imageurl,headers=headers)
html=req.urlopen(request).read()
with open(filename,'wb') as f:
f.write(html)
根据图片的URL链接,获取html的相应内容,再将其写入到本地(图片需要用"wb"模式进行写入)。
五、效果演示
六、结束语
最后,祝大家都能够学有所成!!!