python爬虫之 爬取案例网页ajax请求的数据2之 跳转url下载图片

本篇是python爬虫之 爬取案例网页ajax请求的数据_水w的博客-CSDN博客的后续补充。

在前文的基础上,我们已经爬取到了第一个ajax请求下我们想要爬取的logo生成url地址,接下来我想要爬取所有的ajax请求下我们想要爬取的logo生成url地址,并且下载这些图片。

思路和步骤:

(1)一直往下翻页面,就会看到一个“加载更多”,就可以看到浏览器开发工具里的ajax请求会多了一个以“https://logo.aliyun.com/logo/buildGoodsList.json?”开头的这个ajax请求(点击“Network”,将查找类别选择为“XHR”,这里面都存放的是浏览器开发工具过滤出来的ajax请求。不明白的小伙伴,可以看我的上一篇文章,里面写的很详细:python爬虫之 爬取案例网页ajax请求的数据_水w的博客-CSDN博客)。

页面就是通过这个“加载更多”按钮来继续发送ajax请求持续获取logo生成图片数据的。这里再次证明了这个ajax请求确实是我们要找的。

此处的ajax请求采取了get请求方式。

请求url地址:https://logo.aliyun.com/logo/buildGoodsList.json?brandName=%E5%B0%8F%E5%A4%A9%E6%89%8D&slogan=Genius&keywords=%E4%BA%92%E8%81%94%E7%BD%91&industryName=%E8%BD%AF%E4%BB%B6%E5%92%8C%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E6%9C%8D%E5%8A%A1%E4%B8%9A&industryId=49&sceneId=2&page=1

请求方式:get

我们可以发现这个ajax请求的url地址后面携带参数param都是关于我们输入项要生成logo的关键词。每一个这种的ajax请求传送了27张生成的logo图片:从0到26。

(2)通过对比这些ajax请求,可以发现随着页面一直向下滑动加载,ajax请求的url地址和参数param也会发生相应的变化。

ajax请求的url地址对比:

# 第一个
https://logo.aliyun.com/logo/buildGoodsList.json?brandName=%E5%B0%8F%E5%A4%A9%E6%89%8D&slogan=Genius&keywords=%E4%BA%92%E8%81%94%E7%BD%91&industryName=%E8%BD%AF%E4%BB%B6%E5%92%8C%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E6%9C%8D%E5%8A%A1%E4%B8%9A&industryId=49&sceneId=2&page=1

# 第二个
https://logo.aliyun.com/logo/buildGoodsList.json?brandName=%E5%B0%8F%E5%A4%A9%E6%89%8D&slogan=Genius&keywords=%E4%BA%92%E8%81%94%E7%BD%91&industryName=%E8%BD%AF%E4%BB%B6%E5%92%8C%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E6%9C%8D%E5%8A%A1%E4%B8%9A&industryId=49&sceneId=2&page=2&version=L2022050712084424675507

# 第三个
https://logo.aliyun.com/logo/buildGoodsList.json?brandName=%E5%B0%8F%E5%A4%A9%E6%89%8D&slogan=Genius&keywords=%E4%BA%92%E8%81%94%E7%BD%91&industryName=%E8%BD%AF%E4%BB%B6%E5%92%8C%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E6%9C%8D%E5%8A%A1%E4%B8%9A&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图片的信息,一共0到26,一共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/537.36 (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图片。

就到这里了!!

猜你喜欢

转载自blog.csdn.net/qq_45956730/article/details/124630811
今日推荐