python学习笔记---爬取百度图片

我的博客仅仅是为了记录学习python的学习过程和成长,不对任何文章的技术负责(^_^)

需求:爬取百度图片

项目分析:百度中的图片属于动态加载的,不能用request获取网页源码进行匹配。经过尝试,我发现于其用selenium去模拟爬取,还有一个更简单的方法
python学习笔记---爬取百度图片_第1张图片
看,动态加载的,难搞,但是有一个更好的办法,

python学习笔记---爬取百度图片_第2张图片
看,我找到了json数据,可以直接对其进行请求,不需要使用selenium了,计划通

实现

首先导包

import requests
import json

设置一下headers和params

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
param = {
    'tn': 'resultjson_com',
    'logid': '11450117138517082972',
    'ipn': 'rj',
    'ct': '201326592',
    'is': '',
    'fp': 'result',
    'fr': '',
    'word': '速涂',
    'queryWord': '速涂',
    'cl': '2',
    'lm': '-1',
    'ie': 'utf-8',
    'oe': 'utf-8',
    'adpicid': '',
    'st': '',
    'z': '',
    'ic': '',
    'hd': '',
    'latest': '',
    'copyright': '',
    's': '',
    'se': '',
    'tab': '',
    'width': '',
    'height': '',
    'face': '',
    'istype': '',
    'qc': '',
    'nc': '',
    'expermode': '',
    'nojc': '',
    'isAsync': '',
    'pn': '90',
    'rn': '30',
    'gsm': '5a',
    '1673751010721': '',
}

数据请求和解析函数

def parse(url):
    response = requests.get(url=url, headers=headers, params=param).json()
    img_list = response['data']
    for img in img_list:
        try:
            img_name = img['fromPageTitle']
            print(img_name)
            img_url = img['replaceUrl'][0]['ObjUrl']
            print(img_url)
        except:
            pass
为了对多个网页进行解析,我们需要创建一个url列表

python学习笔记---爬取百度图片_第3张图片
python学习笔记---爬取百度图片_第4张图片
看这两张图片的对比,只有pn产生了变化,很明显我们可以猜测它的全称是page_num,s所以我们只需要对它进行操作就可以得到不同的数据

url_list = []
for i in range(90, 301, 30):
    url = 'https://image.baidu.com/search/acjson?tn=resultjson_com' \
          '&logid=11450117138517082972&ipn=rj&ct=201326592&is=&fp=result' \
          '&fr=&word=%E9%80%9F%E6%B6%82&queryWord=%E9%80%9F%E6%B6%82' \
          '&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=' \
          '&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&expermode=&nojc=&isAsync=' \
          '&pn={}&rn=30&gsm=5a&1673751010721='.format(i)

    url_list.append(url)

最后,调用函数就可以了

if __name__ == '__main__':
    for url in url_list:
        parse(url=url)

你可能感兴趣的:(htmlpython)