流程
1.获取百度图片的url
https://image.baidu.com/search/index?tn=baiduimage&word=xxx
- 正则
右键百度图片中的图片元素,找到图片的链接(以.jpg结尾),然后右键源代码中查看是否存在该资源(确保是静态部分)
根据源码中的图片标签写正则
源码中图片标签html如下:
"thumbURL":"https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1086547525,3479825412&fm=26&gp=0.jpg"
根据该html写正则
"thumbURL":"(.*?)"
- 爬虫代码
import requests
from urllib import parse
import time
import random
import re
import os
class BaiduImage(object):
def __init__(self):
self.url = 'https://image.baidu.com/search/index?tn=baiduimage&word={}'
self.headers = {'User-Agent':'Mozilla/5.0'}
#向一级页面发请求,提取前30张图片的二级页面的链接
def get_image(self,url,word):
html = requests.get(url=url,headers=self.headers).text
#创建编译对象
p = re.compile('"thumbURL":"(.*?)"',re.S)
# re匹配,将30张图片的链接放入list
#findall()返回的数据格式为['xxx.jpg','xxx.jpg']
link_list = p.findall(html)
#向图片链接发请求,并保存到本地
self.save_image(link_list,word)
#保存图片到指定路径的函数
def save_image(self,link_list,word):
#定义保存图片的路径名并创建文件夹
directory = '/home/tarena/images/{}/'.format(word)
#如果系统中没有该文件夹则创建
if not os.path.exists(directory):
os.makedirs(directory)
#发请求,获取链接对应的图片(二进制文件,需用.content)
for link in link_list:
html = requests.get(url=link,headers=self.headers).content
#定义保存的图片的文件名
filename = directory + link[-10:]
with open(filename,'wb') as f:
f.write(html)
print(filename,'下载成功')
#入口函数
def run(self):
word = input('你想要谁的照片,请输入:')
#因为输入的可能为中文,需要对查询字符串进行编码
params = parse.quote(word)
url = self.url.format(params)
self.get_image(url,word)
if __name__ == '__main__':
spider = BaiduImage()
spider.run()