爬取糗事百科图片

2022-09-20 19:04:39 浏览数 (1)

昨天又复习了一遍正则,今天继续学爬虫,今天学的是爬取糗事百科页面上的图片。

如何将页面中的图片都爬取下来呢

按下键盘上的F12

使用查看器可以得到,图片的地址在<div class="thumb">之下<img src=" 的后面到 " 结束,所以可以先获取网页数据,然后用正则表达式提取图片的url。

正则的分析:

在字符串中,包含换行符n,在这种情况下:

如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。

而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。

以下为代码:

代码语言:javascript复制
import requests
import re

if __name__ == '__main__':
    # 糗事百科的热图页面url
    url = "https://www.qiushibaike.com/imgrank/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
    }
    # 获取页面数据
    page_text = requests.get(url=url, headers=headers).text
    # 使用正则表达式提取出图片的地址
    results = re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>', page_text, re.S)
    for index, result in enumerate(results):  # 使用枚举获得索引
        # 拼接图片的url地址
        pic_url = "https:"   result
        # 获取响应数据,由于是图片所以使用content(二进制)
        image_data = requests.get(url=pic_url, headers=headers).content
        # 存储图片
        with open(r"../image/image0{}.jpg".format(index), "wb") as fp:
            fp.write(image_data)
    print("all done")

完成!但是总感觉有点问题,图片应该不止这么多张

打开查看:

成功。

现在爬取多页数据,当我切换页码h时,可以发现地址栏的变化,即url只有代表页码的数字是变化的。

所以可以升级优化我的代码,将发送url请求放进一个for循环中:

代码语言:javascript复制
import requests
import re

if __name__ == '__main__':
    # 糗事百科的热图页面url
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
    }
    for page in range(1, 11):
        循环获取不同页面的url
        url = "https://www.qiushibaike.com/imgrank/page/{}/".format(page)

        # 获取页面数据
        page_text = requests.get(url=url, headers=headers).text
        # 使用正则表达式提取出图片的地址
        results = re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>', page_text, re.S)
        for index, result in enumerate(results):  # 使用枚举获得索引
            # 拼接图片的url地址
            pic_url = "https:"   result
            # 获取响应数据,使用content保存图片(二进制)
            image_data = requests.get(url=pic_url, headers=headers).content  # 二进制用content
            # 存储图片
            with open(r"../image/image0{}.jpg".format(index), "wb") as fp:
                fp.write(image_data)
        print("all done")

下面都要跟着缩进。

0 人点赞