python bing 风景图爬取

说明:个人因项目需要风景图数据集而写,仅供参考。

配置:ubuntu20、firefox、pycharm、requests、BeautifulSoup

步骤:

1、bing搜索“风景图”,按F12,点击“网络”,点击“XHR”,按F5刷新,滑轮往下拉,进入如图所示状态。

python bing 风景图爬取_第1张图片

 

2、与其他的新弹出的get请求对比可知将前面一致的网址复制,后面的舍去,first每次加35即可。

3、查看单张图片HTML代码,可知src为图片url。

python bing 风景图爬取_第2张图片

 

代码:

total:请自己按需选取

headers:请自己填写

url:不一定是风景图,bing其他的应该也可以。

response.encoding:按F12搜charset,按网页编码填写

import requests
from requests.exceptions import ReadTimeout, HTTPError, RequestException
from bs4 import BeautifulSoup
import re
import os
import time


def main():
    total = 350  # 因为bing每组缩略图是35张,所以total最好是35的倍数
    floop = total // 35  # 缩略图总组数
    img_loc = "./img"  # 储存图片的文件夹
    if total % 35 != 0:  # 如果total不是35的倍数,如10,则floop需要加1才能下载图片
        floop += 1
    if not os.path.exists("./img"):
        print("不存在图片存储文件夹,进行新建。")
        os.mkdir(img_loc)
    # 请求头请自己填写
    headers = {"User-Agent": ""}

    for i in range(0, floop):
        # 第几组缩略图网址
        url = "https://cn.bing.com/images/async?q=%E9%A3%8E%E6%99%AF%E5%9B%BE&first={}&count=35&cw=1320&ch=383&relp=35&apc=0&tsc=ImageHoverTitle&datsrc=I&layout=RowBased_Landscape&mmasync=1".format(
            i * 35)
        response = requests.get(url=url, headers=headers, timeout=5)
        # 请自己查看网页编码为多少,不为utf-8则进行修改。
        response.encoding = "utf-8"
        soup = BeautifulSoup(response.text, features="lxml")
        if response.status_code == 200:
            for idx, j in enumerate(soup.find_all(class_=re.compile("mimg.*"))):
                img_url = j["src"]
                img_name = idx + i * 35 + 1  # 以第几张图片为名
                if img_name == total + 1:  # 当total不是35的倍数时,下载到上一张图片为止
                    break
                try:
                    img_response = requests.get(url=img_url, headers=headers, timeout=3)
                    img = img_response.content
                    # 不知道为什么我直接以img_name建立文件,会有plain后缀的图片,所以才进行的重命名。。。
                    with open(img_loc + "/%s" % img_url.split("/")[-1], "wb") as f:
                        f.write(img)
                    # 我用的ubuntu写的,不用加.png等后缀,windows可能要加上.png等后缀。
                    os.rename(img_loc + "/%s" % img_url.split("/")[-1], img_loc + "/%d" % img_name)
                    print("第%d张图片下载成功" % img_name)
                except ReadTimeout:  # 超时异常
                    print("timeout")
                except HTTPError:  # HTTP异常
                    print("http error")
                except RequestException:  # 请求异常
                    print("request error")
                finally:
                    time.sleep(1)  # 防止访问频率太高封ip
        else:
            print("第%d组缩略图状态码:" % i, response.status_code)
    print("下载完成!")


if __name__ == "__main__":
    main()

ps:若哪里有错误或改进地方,请不吝赐教。

你可能感兴趣的:(python,爬虫,开发语言)