• 爬虫笔记(三)爬取‘糗事百科’热图板块所有图


    目的:爬取‘糗事百科’热图板块所有图

    在网页response中可以发现,每个图是一个没有http开头的、以.jpg结尾的链接,在这个链接前边补上http可以成功访问该图片。

    所以第一步应该把需要下载的图片的url下载下来,然后补上http,再下载,保存到本地就可以。

    下边代码是第一步。

    def download_picture_url(pageup,pagedonw):  #下载每个图片的url(url前边没有http)
        picture_url = []
        for page in range(pageup,pagedonw):
            #https://www.qiushibaike.com/imgrank/page/2/
            url = 'https://www.qiushibaike.com/imgrank/page/'  #补充连接
            url = url + str(page) + '/'
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
            }
            page_test = requests.get(url=url, headers=headers).text
            # print(page_test)
            data_list = re.findall(r'<div class="thumb">.*?</div>', page_test, re.S)
            for div in data_list:
                picture_url.append(re.search(r'(<img src="//)(.*?)(" alt=)', div, re.S).group(2))
        for i in picture_url:
            if i[-3:] != 'jpg':
                picture_url.remove(i)
        return picture_url
        for page in range(pageup,pagedonw):
            #https://www.qiushibaike.com/imgrank/page/2/
            url = 'https://www.qiushibaike.com/imgrank/page/'  #补充连接
            url = url + str(page) + '/'

    上边代码中是为了实现翻页,每一页的url最后page不一样,所以这样写。

    其中response是一个text格式,里边有很多的无用信息,需要从text中提取图片的url。

    这里需要说一点,查看浏览器的response不能只看xhr里的,xhr里是动态的,应该查看all里的,

     这个才是网页的返回信息,其他的请求都是请求的这个网页后续再请求的内容。也就是在pycharm中requests的返回时这个'imrank/'里的内容。

    代码中还涉及到一个re模块的正则匹配,为的是挑出里边图片的url。代码中做了两次正则,第一次有开始和结束标记

     第二次才是真正的url

    第二步:每一个url前边添加http

    def add_http(list_url):   #给每一个图片的url添加http
        list_url_new = []
        for i_url in list_url:
            i_url = 'https://'+i_url
            list_url_new.append(i_url)
        return list_url_new

    第三部:下载图片到本地

    def download(list):  #下载每一个图片
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
        }
        if not os.path.exists('./qiushilib'):  #建路径立一个文件夹,如果不想在当前目录下建,可以用makedirs建,参数写绝对
            os.makedirs('./qiushilib')
        num = 1
        for i in list:
            picture_content = requests.get(url=i, headers=headers).content
            #path = './qiushilib' + '/' + i.split('/')[-1]
            path = './qiushilib' + '/' + ''+str(num)+''+i.split('/')[-1]
            with open(path, 'wb') as p:
                p.write(picture_content)
                print(i.split('/')[-1], '下载成功',num)
            num = num + 1

    在前几次下载中,发现不论怕多少页,结果都是25张图。经过研究发现,第一页中每一张图和和第二页中每一张图.jpg前边的编号是一样的,所以造成如果用编号做图片名称的话,导致只能下载第一页的,第二页相当于就有这个文件名了,就不下载了。

    整个过程没有解决的问题:由于家里网络不稳定,导致经常下载失败,目前还不会下载失败重新下载,或多试几次这个功能,日后也是需要学习的。

    最后主函数:

    if __name__ == '__main__':
        picture_url = download_picture_url(1, 3)
        list_url_new = add_http(picture_url)
        download(list_url_new)
  • 相关阅读:
    minimum-path-sum
    pascals-triangle
    Java -- 二分查找
    redis缓存雪崩,击穿,穿透(copy)
    使用redis限制提交次数
    数据库的悲观锁和乐观锁
    mysql常用命令
    php压缩Zip文件和文件打包下载
    php去除数据库的数据空格
    php获取本年、本月、本周时间戳和日期格式的实例代码(分析)
  • 原文地址:https://www.cnblogs.com/lgwdx/p/14226958.html
Copyright © 2020-2023  润新知