为了抓取网站,我们首先需要下载包含有感兴趣数据的网页,该过程一般被称为爬取“crawing”。爬取一个网站有很多种方法,而选用哪种方法更加合适,则取决于目标网站的结构。本章中,首先会探讨如何安全地下载网页,然后会介绍如下3种爬取网站的常见方法:

  • 爬取网站地图
  • 遍历每个网页的数据库ID
  • 跟踪网页链接

下载网页

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

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

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

import urllib2def download(url)print("Download: ",url)try:html = urllib2.urlopen(url).read()except urllib2.URLError as e:print("Download error: ",e.reason)html = Nonereturn html

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

重新下载

  下载时遇到的错误经常是临时性的,比如服务器过载时返回的 503 service unavailable 错误。对于此类错误,我们可以尝试重新下载,因为这个服务器问题现在可能已解决。不过,我们不需要对所有错误都尝试重新下载。如果服务器返回的是 404 not found 这种错误,则说明该网页目前并不存在,再次尝试同样的请求一般也不会出现不同的结果。

  互联网工程任务组(Inter Engineering Task Force)定义了HTTP错误的完整列表,详情可参考 http://tools.ietf.org/html/rfc7231#section-6  从该文档中,我们可以了解到 4XX 错误发生在请求存在问题时,而 5XX 错误发生在服务端存在问题时。所以,我们只需要确保 download 函数在发生 5XX 错误时重试下载即可。下面是支持重试下载功能的新版本代码。

#python2
import urllib2def download(url, num_retries=2):print 'Download:',urltry:html = urllib2.urlopen(url).read()except urllib2.URLError as e:print('Download error: ',e.reason)html = Noneif num_retries > 0:if hasattr(e, 'code') and 500 <= e.code <600:    #hasattr() 函数用于判断对象是否包含对应的属性。# recursively retry 5xx HTTP errorsreturn download(url, num_retries-1)return html

#maybe made in Richard lawson

#python3
import os
import urllib.request
import urllib.errordef download(url, num_retries=2):print ("Download:",url)try:html = urllib.request.urlopen(url).read()except urllib.error.URLError as e:print("Download error: ",e.reason)html = Noneif num_retries > 0 and 500 <= e.code <600:# recursively retry 5xx HTTP errorsreturn download(url, num_retries-1)return htmlprint(download("http://httpstat.us/500"))os.system("pause")
#made in China

现在,当download函数遇到 5XX 错误码时,将会递归调用函数自身进行尝试。此外,该函数还增加了一个参数,用于设定重试下载的次数,其默认值为两次。我们在这里限制网页下载的尝试次数,是因为服务器错误可能暂时还没有解决。想要测试该函数,可以尝试下载 http://httpstat.us/500 ,该网站会始终返回500错误码。

将会显示类似如下的文本

Download: http://httpstat.us/500
Download error:  Internal Server Error
Download: http://httpstat.us/500
Download error:  Internal Server Error
Download: http://httpstat.us/500
Download error:  Internal Server Error
None
请按任意键继续. . .

从上面的返回结果可以看出,download 函数的行为和预期一致,先尝试下载网页,在接收到500错误后,又进行了两次重试才放弃。

设置用户代理

  默认情况下,urllib2 使用Python-urllib/2.7 作为用户代理下载网页内容,其中2.7是Python的版本号。如果能使用可辨识的用户代理则更好,这样可以避免我们的网络爬虫碰到一些问题。此外,也许是因为曾经经历过质量不佳的Python网络爬虫造成的服务器过载,一些网站还会封禁这个默认的用户代理。比如,在使用python默认用户代理的情况下,访问 http://meetup.com/ ,目前会返回如下访问拒绝提示。

Access deniedThe owner of this website(www.meetup.com) has banned your access based on your brower's signature (1754134676cf0ac4-ua48).

Ray ID: 1754134676cf0ac4
Timestamp:Mon,06-Oct-14 18:55:48 GMT
Your IP address:
Requested URL:www.meetup.com/
Error reference number: 1010
Server ID: FL_33F7
User-Agent: Python-urllib/2.7

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

def download(url, user_agent='wswp', num_retries=2):print 'Download:', url headers = {'User-agent':user_agent}request = urllib2.Request{url, headers=headers}try:html = urllib2.urlopen(request).read()except urllib.URLError as e:print 'Download error:', e.reasonhtml = Noneif num_retries > 0:if hasattr(e, 'code') and 500 <= e.code <600:# recursively retry 5xx HTTP errorsreturn download(url, num_retries-1)return html

现在,我们拥有了一个灵活的下载函数,可以在后续示例中得到复用。该函数能够捕获异常、重试下载并设置用户代理。

转载于:https://www.cnblogs.com/callmebg/p/9324303.html

《用python写网络爬虫》 编写第一个网络爬虫相关推荐

  1. java爬虫编写步骤_JAVA爬虫--编写第一个网络爬虫程序

    JAVA爬虫–编写第一个网络爬虫程序 前言上一章节介绍了XPATH基础语法,本章节将手把手带大家编写第一个爬虫程序,同时也希望能通过这个爬虫程序,帮助大家熟悉上一章节学习的XPATH基础语法并运用到实 ...

  2. 《小朱家的爬虫》第二课------- 编写第一个网络爬虫

    一.Python的安装 就在这安装就好了 https://www.python.org/getit/ 一定要注意选择自己电脑的型号,其他的倒也是没啥 这里我推荐的编译器是PyCharm,别问什么,我要 ...

  3. 第一个python爬虫_Python爬虫01——第一个小爬虫

    Python小爬虫--贴吧图片的爬取 在对Python有了一定的基础学习后,进行贴吧图片抓取小程序的编写. 目标: 首先肯定要实现图片抓取这个基本功能 然后实现对用户所给的链接进行抓取 最后要有一定的 ...

  4. Python爬虫01——第一个小爬虫

    原文:https://www.cnblogs.com/Axi8/p/5757270.html Python小爬虫--贴吧图片的爬取 在对Python有了一定的基础学习后,进行贴吧图片抓取小程序的编写. ...

  5. Python写一个MS-DOS系统 - 第一天 欢迎及ECHO和EXIT命令实现

    最近对MS-DOS系统比较感兴趣,想自己做一个,于是我用Python做了一个MS-DOS系统.(很简单,没有任何复杂代码) 1.工具 代码编辑器:Visual Studio Code,这是官网链接. ...

  6. python写采集程序_python实现简易采集爬虫

    #!/usr/bin/python#-*-coding:utf-8-*- #简易采集爬虫#1.采集Yahoo!Answers,parseData函数修改一下,可以采集任何网站#2.需要sqlite3或 ...

  7. python写签到软件_第一个实用python程序——自动填写工作日志、签到

    刚刚把文章重看了一遍,自己给的评价就是:闲的没事干了? 1. 前言 一直苦于每天要分上下午两次写工作日志(不太能理解单位某些部门的脑洞--一天一次不行么?噢--噢噢,好吧,你们抄的模板就是分上下午的, ...

  8. python写的有道翻译代码_Python爬虫10行代码实现调用有道翻译,以及加入语音功能...

    版本1.0 有道翻译这个项目很多人做过,但这个版本可能是你看过最简洁的,代码10行.我们把它命名为'版本1.0',后续版本可以直接引用这个代码 代码展示:import requests import ...

  9. 爬虫 【第一章】爬虫基本原理

    一.爬虫是什么? #1.什么是互联网?互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样.#2.互联网建立的目的?互联网的核心价值在于数据的共享/传递:数据是存 ...

最新文章

  1. PyCharm_10个加速省时间技巧
  2. 软件工程(2019)第一次结对作业
  3. 每日一皮:当你要下班的时候,突然测试叫住了你...
  4. python编写一个软件-使用python制作一个解压缩软件
  5. SQL Server 的通用分页显示存储过程
  6. 从一个程序员的角度告诉你:12306有多牛逼?
  7. 从BIO、NIO到Netty
  8. 《C程序设计新思维》一6.3 不使用malloc的指针
  9. C++_二维数组_定义方式_数组名称的作用_案例考试成绩统计---C++语言工作笔记021
  10. 8种提升ASP.NET Web API性能的方法
  11. ReadOnly与Enabled
  12. Happy Mid-Autumn Festival !
  13. java实战项目教程
  14. 利用word2vec创建中文主题词典——以网络暴力关键词为例
  15. iOS开发中使用代码控制横竖屏的切换
  16. 山寨芯片大鳄终于来了MTK6577 A9双核全功能通讯平板(2012年芯片,低端以A9双核为代表)
  17. windows c++ 获取本地ip地址
  18. 熔断机制什么意思_什么是熔断机制 熔断机制是什么意思
  19. 各种二手及全新的光纤熔(融)接机,OTDR,光测试仪器仪表等
  20. Gunicorn、Supervisor

热门文章

  1. python编写的心得_Python开发之我的小心得
  2. 为什么有的父母喜欢在子女之间,来回拨弄是非,使他们反目?
  3. 退休后工资1700多元的人多吗?
  4. 年关将至,很多朋友想要创业的心又开始蠢蠢欲动了
  5. 所有的生意都是在做两件事
  6. 京东也准备向社区团购进发了?
  7. 晚上睡觉的时候应该把wifi关掉吗?
  8. Java多线程基本概念
  9. ecos中的spl同步机制
  10. 如何创建SQL Server报告服务(SSRS)报告