python 网络爬虫(二)

摘要:
下面的实例脚本使用Python的urllib2模块下载URL:importurllib2defdownload:returnurllib2.urlopen.read()当传入URL参数时,该函数将会下载网页并返回其HTML。此外,也许是因为曾经经历过质量不佳的Python网络爬虫造成的服务器过载,一些网站还会封禁这个默认的用户代理。

一、编写第一个网络爬虫

为了抓取网站,我们需要下载含有感兴趣的网页,该过程一般被称为爬取(crawling)。爬取一个网站有多种方法,而选择哪种方法更加合适,则取决于目标网站的结构。

首先探讨如何安全的下载网页,让后介绍3中爬去网站的常见方法:

-- 爬取网站地图;

-- 遍历每个网页的数据库 ID;

-- 跟踪网页链接;

1、下载网页

要想爬取网页,我们首先将其下载下来。下面的实例脚本使用 Python 的 urllib2 模块下载 URL:

import urllib2
def download(url):
    return urllib2.urlopen(url).read()

当传入 URL 参数时,该函数将会下载网页并返回其 HTML 。不过,这个代码片段存在一个问题,即当下载网页时,饿哦们可能会遇到一些无法控制的错误,比如请求的页面可能不存在,此时,urllib2 会抛出异常,然后退出脚本。安全起见,下面给出一个更健壮的版本,可以捕获这些异常:

import urllib2

def download(url):
    print('Downloading:', url)
    try:
        html =urllib2.urlopen(url).read()
    except urllib2.URLError ase:
        print('Download error:', e.reason)
        html =None
        
    return html

现在,当出现下载错误是,该函数能够捕获异常,然后返回 None。

当 download 函数遇到 5xx 错误码时,将会递归调用函数自身进行重试。

import urllib2

def download(url, num_retries = 2):
    print('Downloading:', url)
    try:
        html =urllib2.urlopen(url).read()
    except urllib2.URLError ase:
        print('Download error:', e.reason)
        html =None
        if num_retries > 0:
            if hasattr(e, 'code') and 500 <= e.code < 00:
                return download(url, num_retries - 1)

此外,该函数还增加了一个参数,用于设定重试下载的次数,其默认值为两次。

2、设置用户代理

默认情况下,urllib2 使用 Python-urllib/2.7 作为用户下载网页内容,其中 2.7 是 python的版本号,如果能使用可辨别的用户代理则更好。这样可以避免爬虫遇到的一些问题。此外,也许是因为曾经经历过质量不佳的Python网络爬虫造成的服务器过载,一些网站还会封禁这个默认的用户代理。

因此,为了下载更可考,我们需要控制用户代理的设定。下面代码对 download 函数进行了修改。设定了一个默认的用户代理 “wswp”(即 We Scraping with Python 的手字母缩写)

import urllib2

def download(url, user_agent = 'wswp', num_retries = 2):
    print('Downloading :', url)
    headers = {'User-agent':user_agent}
    request = urllib2.Request(url, headers =headers)
    try:
        html =urllib2.urlopen(request).read()
    except urllib2.URLError ase:
        print('Download error:', e.reason)
        html =None
        
        if num_retries > 0:
            if hasattr(e, 'code') and 500 <= e.code < 600:
                return download(url, user_agent, num_retries - 1)
      
    return html

现在我们拥有一个灵活的下载函数,该函数能够捕获异常,重试下载并设置了用户代理。

免责声明:文章转载自《python 网络爬虫(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇&amp;lt;th:&amp;gt;标签使用ORA-10635: Invalid segment or tablespace type下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解

作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位。那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能。然而这个时候各种各样的问题也就来了,之前网上一直有零零碎碎的移植教程,但是都不完整,或是有这样或者那样的问题。今天刚刚研究成功了Cocos2dx-3.0版本项目的安卓平台移植...

采用文件方式安装Python第三方库

由于Python某些第三方库仅提供源代码,通过pip下载文件后无法在Windows系统编译安装,会导致第三方库安装失败。为了解决这类第三方库的安装问题,美国加州大学尔湾分校提供了一个网页,帮助Python用户获得Windows可直接安装的第三方库文件。 1、下载网址https://www.lfd.uci.edu/~gohlke/pythonlibs 2、安...

什么是session?

Session一般译作会话。从不同的层面看待session,它有着类似但不全然相同的含义。比如,在web应用的用户看来,他打开浏览器访问一个电子商务网站,登录、并完成购物直到关闭浏览器,这是一个会话。而在web应用的开发者开来,用户登录时我需要创建一个数据结构以存储用户的登录信息,这个结构也叫做session。因此在谈论session的时候要注意上下文环境...

python os.path模块常用方法详解(转)

转自:https://www.cnblogs.com/wuxie1989/p/5623435.html os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法。更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.html 1.os.path.abspath(path) ...

利用python将ip转换为10进制

def int2ip(num): data = [] for i in range(4): num ,extra = divmod(num, 256) data.insert(0, str(extra)) return ".".join(data) def ip2int(astr): ipnum = astr.split(".") num = 0 for...

车牌识别(end-to-end-for-chinese-plate-recognition)项目搭建基于Mxnet(Python 3.5)

最近看到geihub上有个车牌识别的项目,感觉很有意思,从上面fork了一下弄到本地自己跑了下。在安装过程中遇到了一些问题,记录如下。 项目github连接:https://github.com/szad670401/end-to-end-for-chinese-plate-recognition ,本机环境Win8 64bit 该项目是基于Python做...