爬虫---从网页上抓取图片(以原神可莉为例)

上期我们讲到正则表达式的用法,知道所有的字符都可以用  .*?  来表示,下面让我们来真正使用它吧。本文一些知识类说明截取该博主的文章, Python爬虫入门教程!手把手教会你爬取网页数据_python爬虫教程_计算机视觉农民工的博客-CSDN博客

一:爬虫的概念

        (一)、概念

        爬虫就是自动获取网页内容的程序,例如搜索引擎,Google,Baidu 等,每天都运行着庞大的爬虫系统,从全世界的网站中爬虫数据,供用户检索时使用。

        (二)、流程

        爬虫的流程简要介绍就是

        -------模拟请求网页。模拟浏览器,打开目标网站。
        -------获取数据。打开网站之后,就可以自动化的获取我们所需要的网站数据。
        -------保存数据。拿到数据之后,需要持久化到本地文件或者数据库等存储设备中。

(三)、库的使用


               那么我们该如何使用 Python 来编写自己的爬虫程序呢,在这里我要重点介绍一个 Python 库:Requests。

Requests 使用
Requests 库是 Python 中发起 HTTP 请求的库,使用非常方便简单。

模拟发送 HTTP 请求

发送 GET 请求

当我们用浏览器打开百度首页时,其实发送的最原始的请求就是 GET 请求

二:如何爬图片

        现在我们就来爬可莉

(一)、导库

# 爬图片    正则表达式  requests用法   爬视频
# 1.导库
from wsgiref import headers

import requests
import re

(二)、先把基本框架搭好

这个是框架先给出来,后面我们一个一个分析

1、获取网站源码:

# 获取网站源码

def get_html(url, headers):
    response = requests.get(url, headers=headers)

    response.encoding = "utf_8"
    return response.text
    # if response.status_code == 200:

    # else:
    #     print("获取源码失败")

2、调用源码

# 定义main函数调用get_html源码
def main():
    url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8759404115215997721&ipn=rj&ct=201326592&is=&fp=result&fr=ala&word=%E5%8F%AF%E8%8E%89&queryWord=%E5%8F%AF%E8%8E%89&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&1696485163125="
    headers = {
 }
    params = {}
html = get_html(url, headers)
print(html)

其中url中的内容就是我们从百度中获取的链接。

3、从网页中获取数据

        ①接下来我们打开浏览器,Edge  /   谷歌都可以
        ②我们进入浏览器搜索百度网页进去,记住一定是百度网页。


 

进去之后我们先点击ALL也就是全部,然后刷新一下,鼠标向上滑,滑到最顶端,也就是index开头,点击它。

        Ⅰ点击标头/Headers,复制URL中的链接(这里留意一下你的url是大写还是小写,后面如果代码运行不了就看看是否大小写出了问题),将链接复制到我们写的main函数中。

        

        Ⅱ注意:复制下面那个请求标头里全部内容到headers中,在粘贴是在前面加上三对双引号,可以避免粘贴时出现大量错误。前面都加上双引号,每句最后加上逗号,有双引号语句就加单引号。(其实就是注释掉)注意格式,python很注意格式。例如下面这样

# 定义main函数调用get_html源码
def main():
    url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8759404115215997721&ipn=rj&ct=201326592&is=&fp=result&fr=ala&word=%E5%8F%AF%E8%8E%89&queryWord=%E5%8F%AF%E8%8E%89&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&1696485163125="
    headers = {
        "Accept":"text/plain, */*; q=0.01",
        "Accept-Encoding":"gzip, deflate",
        "Accept-Language":"zh-CN,zh;q=0.9",
        "Connection":"keep-alive",
        "Cookie":"BDqhfp=%E5%8E%9F%E7%A5%9E%E5%8F%AF%E8%8E%89%E5%9B%BE%E7%89%87%26%26NaN-1undefined%26%263876%26%266; BIDUPSID=C4A8B9F9C3B27145F94A0A46256A57BE; PSTM=1678688920; ZFY=g2bnFepdt3:AAlVQAVs1fFvpbAU1SIYFwyCnF2Q5bMeo:C; __bid_n=188940fe9cb638ca9d4207; FPTOKEN=ziX5y/CNOyyfQHXZkteEDKG1fLRFjOG9t3E3jcToUXM1qFTS0EJFkz9BDEwR5Ph7g0EJzZkKn5Tbefp2ZhcdKoulr9cBpJtD9fw2SdB70H3YaMXplX7NugPxJNh8Fz/yQylF9ari76mK1GHCJaRF7vdYoZmrS1AvqWu7IAoO99DZt6CZ82VhG4Wy9W1B6QmDqnAVYTQLmnQ46PWgEJxgynWC2YFkdBJT1Elg8WflDkmxs/U+rqrIt/vgTQuNi1UyZzCJBEnd1qnd8i//PeJ2cSnqZvaYONGcQWV8+rsEe9EyjuCudeVPskNUOc6S10Vqmmp/o5wEtqTxaMYkr9SrEEy9aPTZifZUMSQqDtdalstawtZCY5tiR39qHe+S5A84zxl/4llNRqeUuHUEv0Z7CA==|binE0C1sEfvZr+OZz+/kbMFDuPS2ivRhYhWaOM9p6k0=|10|a00a66977e6b2fee93c554d192a03a8e; BAIDUID=C9052A101E56BDC2247A946A62B8565B:FG=1; BAIDUID_BFESS=C9052A101E56BDC2247A946A62B8565B:FG=1; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; userFrom=null; ab_sr=1.0.1_YmE4ZTAwZmUxYjYzZGQwN2ZjYTZlYTJkYjE1N2NjYjNjODI2Yjc2NDAwOWIwNjRjMGMyMDViNTdjN2VjZWMwODFhNDRiMzFmOTlmNzI4MTA0NTgxMjMyNDU5NzVlOTdkN2JhNjRjYzA2OThlNTBmMjA1ODNhNDljYWJjMmNiOTgwZTNjYjE2NWI2YmM2YjQ1NjViNWQyZTM1Njc0NWQxOA==",
        "Host":"image.baidu.com",
        "Referer":"https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%D4%AD%C9%F1%BF%C9%C0%F2%CD%BC%C6%AC&fr=ala&ala=1&alatpl=normal&pos=0&dyTabStr=MTEsMCwzLDIsMSw2LDQsNSw3LDgsOQ%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",
    }
③接下来我们解析出所有的缩略图URL,并用正则表达式来匹配其中的url,按原路返回。
# 从给定的HTML字符串中解析出所有的缩略图URL
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
# 调用html函数  result 解析HTML文档并从中提取出图片的URL。
    html = get_html(url, headers)
    result = parse_pic_url(html)
    pic_name = 0
⑥现在我们将图片保存到本地
# 保存图片
def save_pic(content, pic_name):
    with open("可莉/" + str(pic_name) + ".jpg", "wb") as f:
        f.write(content)
        f.close()
⑦再次打开刚才的网页

找到Fetch,鼠标向下滑图片,会看到刷新点acjson数据,如果刷不出来多试几次,网速问题。

⑧随便点进去一个,找到payload复制所有内容到我们刚才打代码中,如图:

注意删除那些冒号后没有内容的句子,和上面一样加上冒号,逗号。

  params = {
         " tn":" resultjson_com",
        "logid":" 8759404115215997721",
         "ipn": "rj",
         " ct": "201326592",
        "fp":" result",
        "fr": "ala",
        "word": "可莉",
         "queryWord":" 可莉",
        "cl": "2",
         "lm": "-1",
         "ie":" utf - 8",
         "oe": "utf - 8",
         "pn": "30",
         "rn":" 30",
        "gsm":"1e",

    }

 结尾。记得在python里新建一个文件夹放图片

# 爬图片    正则表达式  requests用法   爬视频
# 1.导库
import os
from wsgiref import headers

import requests
import re


# 获取网站源码

def get_html(url, headers):
    response = requests.get(url, headers=headers)

    response.encoding = "utf_8"
    return response.text
    # if response.status_code == 200:

    # else:
    #     print("获取源码失败")

# 从给定的HTML字符串中解析出所有的缩略图URL
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 create_fold(fold_name):
    # 加异常处理
    try:
        os.mkdir(fold_name)
    except:
        print("文件夹已存在")


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


# 定义main函数调用get_html源码
def main():
    # 输入文件夹的名字
    fold_name = input("请输入您要抓取图片的名字")
    # 输入要抓取的图片页数
    page_num = input("请输入要抓取多少页?(0,1,2,3,4,......)")
    # 调用函数  创建文件夹
    create_fold(fold_name)
    # 定义图片名字
    pic_name = 0
    # 构建循环 控制页面  1页30张   3页90张
    # 让它自己选择
    for i in range(int(page_num)):
        url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8759404115215997721&ipn=rj&ct=201326592&is=&fp=result&fr=ala&word=%E5%8F%AF%E8%8E%89&queryWord=%E5%8F%AF%E8%8E%89&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&1696485163125="
        headers = {
        "Accept":"text/plain, */*; q=0.01",
        "Accept-Encoding":"gzip, deflate",
        "Accept-Language":"zh-CN,zh;q=0.9",
        "Connection":"keep-alive",
        "Cookie":"BDqhfp=%E5%8E%9F%E7%A5%9E%E5%8F%AF%E8%8E%89%E5%9B%BE%E7%89%87%26%26NaN-1undefined%26%263876%26%266; BIDUPSID=C4A8B9F9C3B27145F94A0A46256A57BE; PSTM=1678688920; ZFY=g2bnFepdt3:AAlVQAVs1fFvpbAU1SIYFwyCnF2Q5bMeo:C; __bid_n=188940fe9cb638ca9d4207; FPTOKEN=ziX5y/CNOyyfQHXZkteEDKG1fLRFjOG9t3E3jcToUXM1qFTS0EJFkz9BDEwR5Ph7g0EJzZkKn5Tbefp2ZhcdKoulr9cBpJtD9fw2SdB70H3YaMXplX7NugPxJNh8Fz/yQylF9ari76mK1GHCJaRF7vdYoZmrS1AvqWu7IAoO99DZt6CZ82VhG4Wy9W1B6QmDqnAVYTQLmnQ46PWgEJxgynWC2YFkdBJT1Elg8WflDkmxs/U+rqrIt/vgTQuNi1UyZzCJBEnd1qnd8i//PeJ2cSnqZvaYONGcQWV8+rsEe9EyjuCudeVPskNUOc6S10Vqmmp/o5wEtqTxaMYkr9SrEEy9aPTZifZUMSQqDtdalstawtZCY5tiR39qHe+S5A84zxl/4llNRqeUuHUEv0Z7CA==|binE0C1sEfvZr+OZz+/kbMFDuPS2ivRhYhWaOM9p6k0=|10|a00a66977e6b2fee93c554d192a03a8e; BAIDUID=C9052A101E56BDC2247A946A62B8565B:FG=1; BAIDUID_BFESS=C9052A101E56BDC2247A946A62B8565B:FG=1; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; userFrom=null; ab_sr=1.0.1_YmE4ZTAwZmUxYjYzZGQwN2ZjYTZlYTJkYjE1N2NjYjNjODI2Yjc2NDAwOWIwNjRjMGMyMDViNTdjN2VjZWMwODFhNDRiMzFmOTlmNzI4MTA0NTgxMjMyNDU5NzVlOTdkN2JhNjRjYzA2OThlNTBmMjA1ODNhNDljYWJjMmNiOTgwZTNjYjE2NWI2YmM2YjQ1NjViNWQyZTM1Njc0NWQxOA==",
        "Host":"image.baidu.com",
        "Referer":"https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%D4%AD%C9%F1%BF%C9%C0%F2%CD%BC%C6%AC&fr=ala&ala=1&alatpl=normal&pos=0&dyTabStr=MTEsMCwzLDIsMSw2LDQsNSw3LDgsOQ%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":" 8759404115215997721",
         "ipn": "rj",
         " ct": "201326592",
        "fp":" result",
        "fr": "ala",
        "word": "可莉",
         "queryWord":" 可莉",
        "cl": "2",
         "lm": "-1",
         "ie":" utf - 8",
         "oe": "utf - 8",
         "pn": str(int(i + 1) * 30),
         "rn":" 30",
        "gsm":"1e",

    }

# 调用html函数  result 解析HTML文档并从中提取出图片的URL。
# 打印一条提示信息,显示正在保存第几张图片
    html = get_html(url, headers)
    result = parse_pic_url(html)
    pic_name = 0
    # 使用for循环遍历列表
    for item in result:
        # print(item)
        # 调用函数获取二进制源码
        pic_content = get_pic_content(item)
        # 调用函数保存图片
        save_pic(pic_content, pic_name)
        pic_name += 1
        print("正在保存" + str(pic_name) + " 张图片")

    # 执行main函数


if __name__ == '__main__':
    main()

这是运行效果,我搜的大熊猫

好了结束了,谢谢观看

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值