python request库,爬取图片的讲解与应用

requests库在python的web应用中使用较多,一些小型爬虫也使用的较多,话不多说,上一段requests爬取糗事百科图片的代码。

# coding:utf-8
import requests
from lxml import etree
import webbrowser
import os


def requests_view(response):
    """
    使用默认浏览器打开临时网页
    :param response: 目标网站的响应
    :return: 
    """
    base_url = response.url
    base_url = '' % base_url
    content = response.content.replace(b'', base_url.encode())
    with open('temp.html', 'wb') as temp_html:
        temp_html.write(content)
    webbrowser.open_new_tab('temp.html')

def get_links(url):
    """
    获取下一页链接,循环爬取
    :param url: 需要爬取得网页
    :return:
    """
    print(url)
    response = requests.get(url)
    html = etree.HTML(response.content)
    imgs = html.xpath('//*[@id="wrapper"]//div[@class="ui-module"]//img/@src')
    links = html.xpath('//*[@id="wrapper"]/div/div[1]/div[9]/div/a[contains(text(),"下一页")]/@href')
    if response.status_code == 200:
        download_imgs(imgs)
    else:
        print(response.status_code, url)
    if len(links) > 0:
        host = 'http://www.qiubaichengren.net/'
        next_url = host + links[-1]
        get_links(next_url)


def download_imgs(imgs):
    """
    下载图片
    :param imgs: 一个图片地址的集合
    :return:
    """
    imgs_dir = r"C:\Users\Administrator\Desktop\pics"
    try:
        for i in imgs:
            img_name = i.split('/')[-1]
            img_path = os.path.join(imgs_dir, img_name)
            content = requests.get(i).content
            with open(img_path,'wb') as f:
                f.write(content)
    except Exception as e:
        print("download_imgs err: %s" % e)

if __name__ == "__main__":
    host_name = 'http://www.qiubaichengren.net'
    response = requests.get(host_name)
    # requests_view(response)
    get_links(host_name)

讲解:

  1. webbrowser是python的一个内置库,应用webbrowser.open_new_tab(url)可以使用系统默认浏览器打开指定的url。
  2. 标签为页面上的所有链接规定默认地址或默认目标。  通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白。  使用 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。
  3. etree.HTML()可以将requests响应的内容格式化成html格式,随后可以对html使用xpath提取我们想要的内容,这里提取图片。
  4. 本例中使用递归来循环爬取网页,可以通过sys.setrecursionlimit()设置python递归层数,防止递归超过python默认递归数,感兴趣的同学可以将此例改写为非递归实现。
  5. 此例可以使用多线程实现哦。

 

你可能感兴趣的:(python request库,爬取图片的讲解与应用)