仅作为记录,代码均可运行
综合
运行后,输入想爬取的页数:
输入1——爬取30张
输入2——爬取60张
输入3——爬取90张
import requests
from lxml import etree
page = input('请输入要爬取多少页:')
page = int(page) + 1
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
n = 0
pn = 1
# pn是从第几张图片获取 百度图片下滑时默认一次性显示30张
for m in range(1, page):
url = 'https://image.baidu.com/search/acjson?'
param = {
'tn': 'resultjson_com',
'logid': '11941270206720072198',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'queryWord': '猫',
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '',
'z':'',
'ic':'',
'hd': '',
'latest': '',
'copyright': '',
'word': '猫',
's':'',
'se':'',
'tab': '',
'width': '',
'height': '',
'face': '',
'istype': '',
'qc': '',
'nc': '1',
'fr': '',
'expermode': '',
'force': '',
'pn': '30',
'rn': '30',
'gsm': '1e',
}
page_text = requests.get(url=url, headers=header, params=param)
page_text.encoding = 'utf-8'
page_text = page_text.json()
info_list = page_text['data']
del info_list[-1]
img_path_list = []
for i in info_list:
img_path_list.append(i['thumbURL'])
for img_path in img_path_list:
img_data = requests.get(url=img_path, headers=header).content
img_path = r'E:\code\python\20191201\b8catimg\catpro\ ' + str(n) + '.jpg'
with open(img_path, 'wb') as fp:
fp.write(img_data)
n = n + 1
pn += 29
步进版
改变程序里pn
的值,表示从某一张开始-爬取30张图片:
如果pn设置为1,表示从第一张开始爬取-爬取其之后的30张图片
改变程序里的n
值,表示存入的图片的命名:
如果n=0,则存入的图片的命名分别为0.jpg、1.jpg、2.jpg、…、29.jpg
import requests
#进行UA伪装
header = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
url = 'https://image.baidu.com/search/acjson?'
param = {
'tn': 'resultjson_com',
'logid': '11941270206720072198',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'queryWord': '猫',
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '',
'z':'',
'ic':'',
'hd': '',
'latest': '',
'copyright': '',
'word': '猫',
's':'',
'se':'',
'tab': '',
'width': '',
'height': '',
'face': '',
'istype': '',
'qc': '',
'nc': '1',
'fr': '',
'expermode': '',
'force': '',
'pn': '30',
'rn': '30',
'gsm': '1e',
}
#将编码形式转换为utf-8
page_text = requests.get(url=url,headers=header,params=param)
page_text.encoding = 'utf-8'
# page_text = page_text.text
# print(page_text)
page_text = page_text.json()
# 先取出所有链接所在的字典,并将其存储在一个列表当中
info_list = page_text['data']
# 由于利用此方式取出的字典最后一个为空,所以删除列表中最后一个元素
del info_list[-1]
# 定义一个存储图片地址的列表
img_path_list = []
for info in info_list:
img_path_list.append(info['thumbURL'])
#再将所有的图片地址取出,进行下载
#n将作为图片的名字
n = 0
for img_path in img_path_list:
img_data = requests.get(url=img_path,headers=header).content # .content获取真正的图片内容
img_path = r'E:\code\python\20191201\b8catimg\catstep\ ' + str(n) + '.jpg'
with open(img_path,'wb') as fp:
fp.write(img_data)
n += 1
print('ok')
转载
理解
现在百度图库的图片跟原来的不一样,(原来是用页码的形式,第一页第二页)现在使用加载的形式,都在同一页里;因此使用ajax请求
的方式爬虫;
跟之前的区别在于多了param
:
param={
}
page_text = requests.get(url=url,headers=header,params=param)
page_text = page_text.json()
最后取page_text里的data的thumbURL
(使用效果:
能将网页源代码一目了然
)
关于XHR选项