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

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

在网页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)
原文地址:https://www.cnblogs.com/lgwdx/p/14226958.html