爬虫也就是所谓的网络数据采集,是一种通过多种手段收集网络数据的方式,不光是通过与 API 交互(或者直接与浏览器交互)的方式。最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用 HTML 表单或其他网页文件),然后对数据进行解析,提取需要的信息。实践中,网络数据采集涉及非常广泛的编程技术和手段,比如数据分析、信息安全等。

要抓取网页数据,要做的就是向服务器发起请求并获取响应,而在Python中,我们可以使用urllib2这个库来实现。

下面是一个发生请求并获取服务器响应的简单的例子:

# -*- coding: utf-8 -*-

# 导入urllib2 库
import urllib2 # 使用urllib2.urlopen()向指定的url发送请求,并返回服务器响应的类文件对象
response = urllib2.urlopen("http://www.baidu.com") # 类文件对象的read()方法可读取文件全部内容,返回字符串
html = response.read() # 打印字符串(页面源码)
print html

上面的例子就是一个简单的爬虫程序,运行程序后打印的结果就是服务器返回的页面源码。其效果和在浏览器输入http://www.baidu.com后查看页面源码是一样的。

使用urlopen()发送请求十分简单,只需要传入目标url即可,但是如果需要执行更复杂的操作,必须创建一个 Request 实例来构造请求。

下面是一个使用Request()方法构造请求的简单的例子:

import urllib2

# url 作为Request()方法的参数,构造并返回一个Request对象
request = urllib2.Request("http://www.baidu.com") # Request对象作为urlopen()方法的参数,发送给服务器并接收响应
response = urllib2.urlopen(request) html = response.read() print html

这个例子的运行结果和上面一样

使用Request()构造请求时,除了必须要的url参数外还有两个可选参数data和headers:

  data:伴随url提交的数据

  headers:一个字典,包含需要发送的HTTP报头的键值对

先来说一说headers中的User-Agent:

像上面的两个例子,直接用urllib2给一个网站发送请求的话,确实十分简单,但是很容易被网站检测到是爬虫程序。如果遇到一些不喜欢被程序(非人为访问)访问的站点,就有可能会拒绝你的访问请求。但是如果我们用一个合法的身份(例如模拟浏览器)去请求别人网站,情况就会好一些,所以我们就应该给我们的爬虫程序加上一个身份,就是所谓的User-Agent。我们可以将爬虫程序伪装成一个被公认的浏览器,用不同的浏览器在发送请求的时候,会有不同的User-Agent头。 urllib2默认的User-Agent头为:Python-urllib/x.y(x和y是Python主版本和次版本号,例如 Python-urllib/2.7)

给爬虫程序添加User-Agent:

import urllib2

url = "http://www.baidu.cn"

#  User-Agent,可以从网上找,也可以自己使用浏览器抓包获取
header = {"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"} # 起构造Request请求,
request = urllib2.Request(url, headers = header) # 向服务器发送这个请求
response = urllib2.urlopen(request) html = response.read()
print html

我们在程序中添加一个火狐浏览器的User-Agent,这样就可以伪造成浏览器进行发送请求。

除了User-Agent,我们还可以在 HTTP Request 中加入特定的 Header,来构造一个完整的HTTP请求消息。

import urllib2

url = "http://www.baidu.cn"

# User-Agent
header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request = urllib2.Request(url, headers = header) #也可以通过调用Request.add_header() 添加/修改一个特定的header
request.add_header("Connection", "keep-alive") # 也可以通过调用Request.get_header()来查看header信息
# request.get_header(header_name="Connection") response = urllib2.urlopen(requset)

#可以查看响应状态码
print response.code
html = response.read() print html

为了程序更好地运行,我们可以做一个User-Agent列表,在爬虫执行时随机选择一个User-Agent使用

# -*- coding: utf-8 -*-

import urllib2
import random url = "http://www.baidu.cn" # User-Agent列表
ua_list = [
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
] # 随机选择一个User-Agent
user_agent = random.choice(ua_list) request = urllib2.Request(url) #也可以通过调用Request.add_header() 添加/修改一个特定的header
request.add_header("User-Agent", user_agent) # 第一个字母大写,后面的全部小写
request.get_header("User-agent") response = urllib2.urlopen(request) html = response.read()
print html

这样每次发送请求就会使用不同的User-Agent。

Python爬虫基础(一)urllib2库的基本使用的更多相关文章

  1. python爬虫,使用urllib2库报错

    urllib2发生报错URLError: <urlopen error [Errno 10061]:首先检查网址是否正确其次如果报这种错误,是因为ie里设置了代理,取消即可, 步骤: 打开IE浏 ...

  2. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  3. python爬虫-基础入门-爬取整个网站《3》

    python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...

  4. python 爬虫基础知识一

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 网络爬虫必备知识点 1. Python基础知识2. P ...

  5. python爬虫-基础入门-爬取整个网站《2》

    python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...

  6. python爬虫-基础入门-爬取整个网站《1》

    python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...

  7. Python爬虫基础

    前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...

  8. python爬虫之re正则表达式库

    python爬虫之re正则表达式库 正则表达式是用来简洁表达一组字符串的表达式. 编译:将符合正则表达式语法的字符串转换成正则表达式特征 操作符 说明 实例 . 表示任何单个字符 [ ] 字符集,对单 ...

  9. python爬虫-基础入门-python爬虫突破封锁

    python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...

  10. Python爬虫--- 1.1请求库的安装与使用

    来说先说爬虫的原理:爬虫本质上是模拟人浏览信息的过程,只不过他通过计算机来达到快速抓取筛选信息的目的所以我们想要写一个爬虫,最基本的就是要将我们需要抓取信息的网页原原本本的抓取下来.这个时候就要用到请 ...

随机推荐

  1. 初涉RxAndroid结合Glide实现多图片载入操作

    转载请注明出处:王亟亟的大牛之路 本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多開始正题 什么是RxJava或者RxAndroid我就不多废话了,理论知识一大堆人给我们做好了. ...

  2. Onject.Instantiate实例

    该函数有两个函数原型: Object Instantiate(Object original,Vector3 position,Quaternion rotation); Onject Instant ...

  3. php字符串算术表达式计算

    $aa = "{1}*{2}-{3}"; $farr = array('/\{1\}/','/\{2\}/','/\{3\}/'); $tarr = array(3,4,10); ...

  4. VMWare虚拟机提示:打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机

    将电脑上存在的虚拟机复制一份后打开运行,弹出错误提示: 打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机. 解决方法如下: 打开存放虚拟机系统硬盘的所在文件夹 ...

  5. PHP-001

    ThinkPHP单字母函数(快捷方法)使用总结 http://www.cnblogs.com/caicaizi/p/5173093.html

  6. Python 流程控制:if

    语法: if 判断条件1: # 如果判断条件1成立,就执行语句1 语句1... if 判断条件1: # 如果判断条件1成立,就执行语句1,否则执行语句2 语句1... else: 语句2... if ...

  7. 写了一个简单的CGI Server

    之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看 ...

  8. vue2.0+element-ui(01简单点的单页面)

    前言: 在<Vue.js权威指南>刚出版的时候,自己就作为一名前端粉捧了一把场,可是真是应了那句“出来混,总是要还的“这句话了,那时候信心满满的买来书想要认真研究,最终却还是把它搁浅了.直 ...

  9. git Xcode

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://2009315319.blog.51cto.com/701759/1158515 ...

  10. cocos2dx游戏--欢欢英雄传说--添加血条

    用一个空血槽图片的Sprite做背景,上面放一个ProgressTimer, 通过设置ProgressTimer的进度来控制血条的长短.建立一个Progress类来实现.Progress.h: #if ...