一、编写第一个网络爬虫

  为了抓取网站,我们需要下载含有感兴趣的网页,该过程一般被称为爬取(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 as e:
print('Download error:', e.reason)
html = None return html

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

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

import urllib2

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

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

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 = ):
print('Downloading :', url)
headers = {'User-agent':user_agent}
request = urllib2.Request(url, headers = headers)
try:
html = urllib2.urlopen(request).read()
except urllib2.URLError as e:
print('Download error:', e.reason)
html = None if num_retries > :
if hasattr(e, 'code') and <= e.code < :
return download(url, user_agent, num_retries - ) return html

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

  

python 网络爬虫(二)的更多相关文章

  1. 【Python网络爬虫二】使用urllib2抓去网页内容

    在Python中通过导入urllib2组件,来完成网页的抓取工作.在python3.x中被改为urllib.request. 爬取具体的过程类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求 ...

  2. Python网络爬虫(二)

    Urllib库之解析链接 Urllib库里有一个parse这个模块,定义了处理URL的标准接口,实现 URL 各部分的抽取,合并以及链接转换.它支持如下协议的 URL 处理:file.ftp.goph ...

  3. python网络爬虫之自动化测试工具selenium[二]

    目录 前言 一.获取今日头条的评论信息(request请求获取json) 1.分析数据 2.获取数据 二.获取今日头条的评论信息(selenium请求获取) 1.分析数据 2.获取数据 房源案例(仅供 ...

  4. python 网络爬虫(二) BFS不断抓URL并放到文件中

    上一篇的python 网络爬虫(一) 简单demo 还不能叫爬虫,只能说基础吧,因为它没有自动化抓链接的功能. 本篇追加如下功能: [1]广度优先搜索不断抓URL,直到队列为空 [2]把所有的URL写 ...

  5. Python网络爬虫

    http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...

  6. Python网络爬虫笔记(五):下载、分析京东P20销售数据

    (一)  分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1.      翻页的时候,谷歌F12的Network页签可以看到下面 ...

  7. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  8. Python网络爬虫与如何爬取段子的项目实例

    一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...

  9. 【python网络爬虫】之requests相关模块

    python网络爬虫的学习第一步 [python网络爬虫]之0 爬虫与反扒 [python网络爬虫]之一 简单介绍 [python网络爬虫]之二 python uillib库 [python网络爬虫] ...

随机推荐

  1. IIS-简介

    参考:https://www.jb51.net/article/85909.htm IIS是什么 iis是用来做什么的?   IIS全程为Internet Information Service(In ...

  2. Java面向对象编程 -6

    数组的基本概念 数组的本质:一组相关变量的集合. 但是需要注意的一点是:在java里面讲数组定义为了引用数据类型,所以数组的使用一定要牵扯到内存分配,那么首先一定要想到使用关键字new来处理 数组的定 ...

  3. C语言:根据以下公式计算s,s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) -在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,

    //根据一下公式计算s,并将计算结果作为函数返回值,n通过形参传入.s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) #include <stdio.h> ...

  4. IIS 部署 web service

    1.在控制台检查 IIS 功能是否已经全部启用 2.重新注册IIS 3.设定程序池的正确版本

  5. hive3.1.1 hive-site.xml

    <property> <name>hive.metastore.warehouse.dir</name> <value>/data/hive/wareh ...

  6. 【安全运维】Vim的基本操作

    i 插入模式 : 末行模式 a 光标后插入 A 切换行末 I 切换行首 o 换行 O 上一行 p 粘贴 u 撤销 yy 复制 4yy 复制四行 dd (剪切)删除一行 2dd (剪切)删除两行 D 剪 ...

  7. 17 JavaScript Cookies

    关于Cookie: Cookie是存储在电脑上的文本文件中的一些数据 Cookie致力于解决如何在连接关闭后记录客户单的用户信息 Cookie以键值对的形式存储,例如username=John Doe ...

  8. Java IO流详解(一)——简单介绍

    文件在程序中是以流的形式来传输的.所以用Java来传输文件就得使用到Java IO流. 1.流的概念和作用 流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象<Thinkin ...

  9. 学习笔记——springMVC架构

    springMVC是一个MVC模式的实现,至于具体什么是MVC大佬们写了多很详细的博文给出一些链接: 链接1. SpringMVC框架“简单”执行流程 1.首先用户(或浏览器)发送请求到服务端. 2. ...

  10. Spring、SpringMvc、MyBatis 整合

    web.xml   SSMProject示例项目下载    SSMProject_jar包 <?xml version="1.0" encoding="UTF-8& ...