[python 爬虫]我的第一个爬虫程序(2)

hello各位,好久不见,我们今天继续:
在上一章我们主要学习了如何重试下载,那么这一章我们来学习一下设置用户代理和其他一些的用法

设置用户代理

用户代理的主要目的是我们的python它使用的是默认用户代理python-requests/2.18.4,但是有些网站曾经经历过质量不佳的爬虫造成的服务器过载,所以会封禁默认的用户代理,接下来,运用前面的知识我们需要对这个函数进行一些更改,将用户代理更改为‘wswp’:

import requests

def download(url, user_agent='wswp', num_retries = 2):
    print('downloading:', url)
    headers = {'User-Agent': user_agent}
    html = requests.get(url, headers = headers)
    if html.status_code != requests.codes.ok:
        e = html.status_code
        print('Download error:', e)
        html = None
        if num_retries > 0:
            if 500 <= e < 600:
                return download(url, num_retries-1)
    return html

网站地图爬虫

在一般的网页之中,该网站的所有网址都会包含在sitemap.xml文件之中,所以我们需要从中找到所有的URL来提取网址从而一个一个爬取这些URL之中的内容,但是往往这个方法不太健全,因为网站可能没有那么好,把它所有包含的网页全部都写在了一个文件之中,甚至有些网站这个sitemap.xml都我们以后会用CSS选择器来解析,对了!这里还需要有一个知识,那就是正则表达式,正则表达式可以帮助筛选网站中的指定内容,非常好用,在这里我们需要从标签中提取URL:

import requests
import re

def download(url, user_agent='wswp', num_retries = 2):
    print('downloading:', url)
    headers = {'User-Agent': user_agent}
    html = requests.get(url, headers = headers)
    if html.status_code != requests.codes.ok:
        e = html.status_code
        print('Download error:', e)
        html = None
        if num_retries > 0:
            if 500 <= e < 600:
                return download(url, num_retries-1)
    return html

def crawl_sitemap(url):
    sitemap = download(url).text
    #通过正则表达式来提取URL
    links = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', sitemap)
    #下载每个连接的内容:
    for link in links:
        download(link)

crawl_sitemap('http://www.vogue.com/sitemap.xml')

看了这一段代码就有这么几个问题想要再强调一下:
首先: sitemap的定义里,download(url)后面一定要加一个.text,只有这样正则表达式里读取的才能是文本内容
其次: 这一段正则表达式的意思是提取网站中所给的url格式链接,至于怎么来的,以后我们有机会可以一起学习正则表达式的使用
最后,针对有一些网站可能找不到sitemap.xml文件,我们也可以另辟蹊径,以后还会有所介绍

Leave a Reply

Your email address will not be published. Required fields are marked *