本爬虫程序写于2022年1月20日,之后网站可能做出调整,导致爬虫失效
注意:百度也有反爬策略,因此需要做到以下两点
(1)headers中要有‘Accept’这个字段的信息
(2)params中的’kw=’ ''要和url中的word保持一致
一、正则表达式语法
二、实现代码
import re
import requests
import os
def get_picture(word, page, x):
url = f'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&word={word}&pn={page*30}'
# pn代表翻页,每30张图片为1页 0 30 60 90 ....
# 伪装的像一点,否则过不了百度安全验证
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
# 必须要加这个,否则失败
params = {
'kw':f'{word}'
}
res = requests.get(url, headers=headers, params=params).content.decode('utf-8')
if not os.path.exists('./images'):
os.mkdir('./images')
for img in re.findall('"objURL":"(.*?)",',res):
print(img)
image = requests.get(img, headers=headers)
open(f'./images/{x}.jpg', 'wb').write(image.content)
x += 1
if __name__ == "__main__":
x = 0
word = input("请输入您要采集的图片名称:")
page = input("请输入您要采集的图片页数:")
for i in range(0,int(page)):
get_picture(word,i,x)
x+=30
print("共爬到%d页,%d个图片" % (page, x))