资讯详情

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

本篇是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图片。

就到这里了!!

标签: 集成电路lm2575hvn

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台