本篇是python爬虫之 爬取案例网页ajax请求的数据_水w的博客-CSDN后续补充博客。
在前面的基础上,我们爬到了第一个ajax请求我们想爬的东西logo生成url接下来,我想爬所有的地址ajax请求我们想爬的东西logo生成url并下载这些图片。
思路和步骤:
(1)一直往下翻页面,就会看到一个在浏览器开发工具中可以看到ajax多了一个请求开头的这个ajax请求(点击请求(点击Network将搜索类别选为XHR浏览器开发工具过滤出来的ajax请求。不懂的朋友,可以看看我的上一篇文章,里面写的很详细:python爬虫之 爬取案例网页ajax请求的数据_水w的博客-CSDN博客)。
页面就是通过这个继续发送按钮ajax持续获取请求logo生成图片数据。这再次证明了这一点ajax我们真的需要找到请求。
此处的ajax请求采取了get请求方式。
请求url地址:https://logo.aliyun.com/logo/buildGoodsList.json?brandName=小天才&slogan=Genius&keywords=互联网&industryName=软件和信息技术服务业&industryId=49&sceneId=2&page=1
请求方式:get
我们可以找到这个ajax请求的url在地址后面携带参数param都是关于我们输入项的生成logo关键词。每个这样的ajax27张生成的请求生成的请求logo图片:从0到26。
(2)通过比较这些ajax请求可以发现,随着页面向下滑动加载,ajax请求的url地址和参数param也会发生相应的变化。
ajax请求的url地址对比:
# 第一个 https://logo.aliyun.com/logo/buildGoodsList.json?brandName=小天才&slogan=Genius&keywords=互联网&industryName=软件和信息技术服务业&industryId=49&sceneId=2&page=1 # 第二个 https://logo.aliyun.com/logo/buildGoodsList.json?brandName=小天才&slogan=Genius&keywords=互联网&industryName=软件和信息技术服务业&industryId=49&sceneId=2&page=2&version=L2022050712084424675507 # 第三个 https://logo.aliyun.com/logo/buildGoodsList.json?brandName=小天才&slogan=Genius&keywords=互联网&industryName=软件和信息技术服务业&industryId=49&sceneId=2&page=3&version=L2022050712084424675507
ajax请求的参数param对比:第二和第三ajax与第一个相比,请求ajax请求不仅page参数变化了,而且多了一个参数version。
(3)然后我们可以通过这些定期的变化来改变参数,然后模拟用户点击加载更多的操作。
浏览器开发者工具中的network”的“XHR”中,这个ajax请求的“Preview”中看到:
- version:我们想爬的下一个ajax要求携带的参数version
-nextPage:我们想爬的下一个ajax要求携带的参数page
-list:我们想爬logo图片信息6张图片信息,共27张logo图片
(4)然后我们开始在上一篇文章写的代码的基础上进行改进。
注意:
-存储图片的位置IMAGE_SRC,改变你的地址路径
eg:(注意斜线的方向)
我的存储图片的位置是D:\大学\实习方面\BaiduSpider\LogoSpider\logo
那么IMAGE_SRC = 'D:///大学/实习/BaiduSpider/LogoSpider/logo/'
-这里只选了data_queue以队列中的第一张图片为例,我只试图保存第一张图片
完整代码部分:
from ensurepip import version from urllib.parse import urlencode from pyquery import PyQuery as pq from bs4 import BeautifulSoup import re,bs4,json,socket,random,os,requests,threading,time,urllib from queue import Queue base_url = "https://logo.aliyun.com/logo/buildGoodsList.json?" headers = { "cookie": "cna=liaPF6GPZ0cCAXuuxE6TaBwc; aliyun_choice=CN; _uab_collina=165174083869593284740835; t=c68c60f79656b6361d4c3299eceefb0d; login_aliyunid_pk=1934551737570629; userViewed=aliyun745882****; aliyun_lang=zh; XSRF-TOKEN=1972b755-e958-4330-86e7-3777d4ab992d; _samesite_flag_=true; cookie2=1da4afe997cab48cc14db3f3c107e487; _tb_token_=e345333e7a7e3; _hvn_login=6; csg=e7a351ed; login_aliyunid=\"aliyun745882****\"; login_aliyunid_ticket=XXZQg4KFWufyvpeV*0*Cm58slMT1tJw3_p$$_29heKupjCAXonKn8srwMrwdWdmdfARMiNcYT7KgxVof_BNpwU_TOTNChZBoeM1KJexdfb9zhYnsN5Zos6qISCrRt7mGxbigG2Cd4fWaCmBZHIzsgd6q0; login_aliyunid_csrf=_csrf_tk_1567151892930436; hssid=1R5BQXbbgg6ZI2G5RDYuPlQ1; hsite=6; aliyun_country=CN; aliyun_site=CN; JSESSIONID=B2DD0AEF589EBA595F400F5B4BC1A34F; isg=BLOzZloi1S8TaJmg6Uvv2hRxQrfd6EeqrRu0HWVQD1IJZNMG7bjX-hH1H5SKEZ-i; l=eBN9iCerLSmJGNcKBOfahurza77OSIRvWuPzaNbMiOCPOV5B5sqfW645E5T6C3hVh68HR3Jfz-p8BeYBqQd-nxv96aiE7Vkmn; tfstk=c3zPBbTpSaQykF0CX4gFdNR7DRPRZ0HnCElZqOvgx4W1DXoliIvKixQtgXR2K0f..", "referer": "https://logo.aliyun.com/logo?msctype=email&mscareaid=cn&mscsiteid=cn&mscmsgid=9140122032200691186&spm=a2c4l.26849360.zh-cnc.1&accounttraceid=76ef6c44de72465daef048c81127602enspq", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53736 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
# 存储图片的位置 D:\大学\实习方面\BaiduSpider\LogoSpider\logo
IMAGE_SRC = 'D://大学/实习方面/BaiduSpider/LogoSpider/logo/'
# 使用队列保存存放图片的id和url地址, 确保线程同步
data_queue = Queue()
def get_page():
params = {
"brandName": "小天才",
"slogan": "Genius",
"keywords": "互联网",
"industryName": "软件和信息技术服务业",
"industryId": 49,
"sceneId": 2,
"page": 1,
}
url = base_url + urlencode(params)
try:
respnose = requests.get(url,headers=headers)
if respnose.status_code==200:
return respnose.json()
except requests.ConnectionError as e:
print("Error",e.args)
def save_img(image_id, image_url):
# """保存图片"""
print('正在下载image_id为',image_id,'地址为:',image_url)
# 设置超时时间
# socket.setdefaulttimeout(8)
try:
if not os.path.exists(IMAGE_SRC):
os.mkdir(IMAGE_SRC)
filename = IMAGE_SRC + image_id + '.jpg'
#如果图片已经存在了,跳过本次循环
if not os.path.exists(filename):
# 下载图片,并保存到文件夹中
urllib.request.urlretrieve(image_url, filename=filename)
print('*******图片image_id为' + str(image_id) + '下载完成')
else:
print('**********此图片已存在')
except IOError as e:
print('保存图片出现异常失败!', e)
if __name__ == '__main__':
j = get_page()
# print(j)
# 将每一个logo图片的url和id数据解析出来,并以字典格式放入队列中保存
for goods in j['data']['images']['list']:
# print({'id':goods['goodsId'],'url':goods['url']})
data_queue.put({"id":goods['goodsId'],"url":goods['url']})
# 得到下一个ajax请求的version参数
version = j['data']['images']['version']
print('version:',version)
# 从队列中取出一个图片信息的字典格式
image = data_queue.get()
save_img(image_id=image['id'],image_url=image['url'])
(5)在vscode新建终端,在终端输入命令执行代码:
python spide.py
vscode的终端显示这张图片已经成功下载了,具体的生成结果如下:
在本文件夹下面新建的logo文件夹里可以看到已经爬取下载成功了一张logo图片了,
我们打开这张图片,如下图所示:
当然,后续还可以爬取目前这个ajax请求里的27张logo图片,再进一步,我们可以通过这些有规律的变化来改变参数,进而达到模拟用户点击“加载更多”这一操作,爬取更多的logo图片。
就到这里了!!