python图片爬虫

爬虫是一种自动化程序,用于在互联网上获取信息。它通过访问网页的链接,并抓取和提取有用的数据,然后将数据保存或进一步处理。爬虫可以用于各种不同的目的,例如搜索引擎的索引建立、数据采集和分析、网络监测等。

第一步是需要导入要用到的包,而图片爬虫要用到的包有三个,分别是:

import os
import re
import requests

os库是与操作系统相关的库,它提供了通用的基本的操作系统交互功能。os库是Python的标准库之一,它里面包含几百个处理函数,能够处理与操作系统相关的功能,包括路径操作、进程管理、环境参数设置等几类功能。在这里的作用是允许执行与文件系统、目录、路径等相关的操作。常见用途包括创建、删除和包移动文件或目录,获取当前工作目录,执行系统命令

re是Python中的一个模块,提供了正则表达式的支持。通过re模块,我们可以进行字符串的匹配、替换和提取等操作。

requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,它是python语言的第三方的库,专门用于发送HTTP请求

包导入完成后需要获取网站源代码以及设置源代码的编码方式

# 获取网站源代码
def get_html(url, headers, params):
    response = requests.get(url, headers=headers, params=params)
    # 设置源代码的编码方式
    response.encoding = "utf-8"
    return response.text

定义一个get_html 函数,包含三个参数:url, headers, params。

url 要访问的网页的URL。
headers 参数包含 HTTP 请求头,用于模拟浏览器请求。这可以包括用户代理(User-Agent)等信息,使请求看起来像来自真实的浏览器。
params 参数用于传递请求。

获取图片的源地址

# 提取图片的源地址
def parse_pic_url(html):
    result = re.findall('thumbURL":"(.*?)"',html, re.S)
    return result

获取图片的二进制源码

# 获取图片的二进制源码
def get_pic_content(url):
    response = requests.get(url)
    return response.content

保存图片

# 保存图片
def save_pic(fold_name, content, pic_name):
    with open(fold_name + "/" + str(pic_name) + ".jpg", "wb") as f:
        f.write(content)
        f.close()

定义一个新建文件夹程序

# 定义一个新建文件夹程序
def create_fold(fold_name):
    # 加异常处理
    try:
        os.mkdir(fold_name)
    except:
        print("文件夹已存在")

定义main函数调用get_html函数

# 定义main函数调用get_html函数
def main():
    # 输入文件夹的名字
    fold_name = input("请输入您要抓取的图片名字:")
    # 输入要抓取的图片页数
    page_num = input("请输入要抓取多少页?(0,1,2,3,.....)")
    # 调用函数,创建文件夹
    create_fold(fold_name)
    # 定义图片名字
    pic_name = 0
    # 构架循环,控制页面
    for i in range(int(page_num)):
        url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=10852600507819913766&ipn=rj&ct=201326592&is=&fp=result&fr=ala&word=%E5%A4%A7%E7%86%8A%E7%8C%AB&queryWord=%E5%A4%A7%E7%86%8A%E7%8C%AB&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=30&rn=30&gsm=1e&1695863766925="
        headers = {
            "Accept": "text/plain, */*; q=0.01",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Connection": "keep-alive",
            "Cookie": "BIDUPSID=2D226CA7BEE5BEA9C5D57D9FD63359E5; PSTM=1694050494; indexPageSugList=%5B%22%E8%88%AA%E6%8B%8D%E6%B1%BD%E8%BD%A6%22%2C%22%E5%8D%AB%E6%98%9F%E5%9C%B0%E5%9B%BE%E6%B1%BD%E8%BD%A6%22%2C%22%E5%8D%AB%E6%98%9F%E6%B1%BD%E8%BD%A6%22%5D; BAIDUID=2D226CA7BEE5BEA957413BEA4433060B:SL=0:NR=10:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=39310_39354_39398_39396_39348_39407_39097_39411_39439_39359_39377_39233_39403_26350_39424; BAIDUID_BFESS=2D226CA7BEE5BEA957413BEA4433060B:SL=0:NR=10:FG=1; delPer=0; PSINO=7; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; userFrom=ala; ab_sr=1.0.1_ZjE0NTIyNGQ3ZTk2N2M3MjZhOTIzM2Y5ZDM2NzE2ZWY1YzQ1NWJjNDA1MmIwNDg5MTlhZDgwNmQ0MzYyMzNiNmMzY2U0ODUwYzBkNWRjM2I0MjY0MTk1MzljMGRjM2MzMmQ1ZTRjMjk1ZmI0YjYzZTE4MjQwNTFlOTZiMWJkZWM2MjBlMTRlYmY4N2QwNDE1ZGExOTAxNGYzMDc1MjE3YQ==; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm",
            "Host": "image.baidu.com",
            "Referer": "https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%B4%F3%D0%DC%C3%A8&fr=ala&ala=1&alatpl=normal&pos=0&dyTabStr=MTEsMCwxLDYsMyw0LDUsMiw4LDcsOQ%3D%3D",
            "Sec-Ch-Ua": '"Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"',
            "Sec-Ch-Ua-Mobile": "?0",
            "Sec-Ch-Ua-Platform": '"Windows"',
            "Sec-Fetch-Dest": "empty",
            "Sec-Fetch-Mode": "cors",
            "Sec-Fetch-Site": "same-origin",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
            "X-Requested-With": "XMLHttpRequest"
        }
        params = {
            "tn": "resultjson_com",
            "logid": "11158382618979180833",
            "ipn": "rj",
            "ct": "201326592",
            "fp": "result",
            "fr": "ala",
            "word": fold_name,
            "queryWord": fold_name,
            "cl": "2",
            "lm": "-1",
            "ie": "utf-8",
            "oe": "utf-8",
            "pn": str(int(i + 1) * 30),
            "rn": "30",
            "gsm": "1e"
        }
        html = get_html(url, headers, params)
        # print(html)
        result = parse_pic_url(html)

怎样获取url呢?

打开百度图片,以大刀为例:

dd9dca0a8746497e81ff7942d85d6de5.png

页面单击右键选择检查,73ff2cea21fb44e984dd10fe6604653b.png

点击Network选择Fetch/XHR

83efc77ab816409392476894685cdc59.png

点击acjson选择Headers

1c240ec8516a49638008cbb15f2bbd11.png

36eda4ca448e4cae85bcde93e25fb8e1.png

我所选中的蓝色部分就是需要的url,从http开始复制。

99a5dfffa11c419fa7e6cf451b14ba3e.png

url粘贴完成后回到浏览器继续下滑找到Request Headers,复制我所选中的内容,粘贴到headers = {}中再继续下滑找到Query String Parameters,复制我所选中的内容粘贴到params = {}中

27f21794f7804d00a1703800e91e57b7.png

word:大刀

queryWord:大刀

需要注意因为再搜索引擎里搜索的是大刀,所以这里params里的word与queryWord后是大刀,为了通用要换成fold_name

为防止系统乱折行,可以在{}中先输入三个英文双引号,headers = {}与params = {}中内容要注意冒号前与冒号后内容要加英文双引号,如果原本就有英文双引号就再加英文单引号

url,headers,params粘贴完成后就使用for循环遍历列表

# 使用for循环遍历列表
for item in result:
    # 调用函数,获取图片的二进制源码
    pic_content = get_pic_content(item)
    # 调用函数保存图片
    save_pic(fold_name, pic_content, pic_name)
    pic_name += 1
    print("正在保存第 " + str(pic_name) + " 张图片")

最后执行main函数

# 执行main函数
if __name__ == "__main__":
    main()
 

9b117062ff794e54ada0b59334ad3f6c.png

c1e10942f9d142ea9a8b13362a71d802.png

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值