Python爬虫基础(一)urllib2库的基本使用
爬虫也就是所谓的网络数据采集,是一种通过多种手段收集网络数据的方式,不光是通过与 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库的基本使用的更多相关文章
- python爬虫,使用urllib2库报错
urllib2发生报错URLError: <urlopen error [Errno 10061]:首先检查网址是否正确其次如果报这种错误,是因为ie里设置了代理,取消即可, 步骤: 打开IE浏 ...
- python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )
python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...
- python爬虫-基础入门-爬取整个网站《3》
python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...
- python 爬虫基础知识一
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 网络爬虫必备知识点 1. Python基础知识2. P ...
- python爬虫-基础入门-爬取整个网站《2》
python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...
- python爬虫-基础入门-爬取整个网站《1》
python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...
- Python爬虫基础
前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...
- python爬虫之re正则表达式库
python爬虫之re正则表达式库 正则表达式是用来简洁表达一组字符串的表达式. 编译:将符合正则表达式语法的字符串转换成正则表达式特征 操作符 说明 实例 . 表示任何单个字符 [ ] 字符集,对单 ...
- python爬虫-基础入门-python爬虫突破封锁
python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...
- Python爬虫--- 1.1请求库的安装与使用
来说先说爬虫的原理:爬虫本质上是模拟人浏览信息的过程,只不过他通过计算机来达到快速抓取筛选信息的目的所以我们想要写一个爬虫,最基本的就是要将我们需要抓取信息的网页原原本本的抓取下来.这个时候就要用到请 ...
随机推荐
- 在linux上开发210的hdmi-servers输出
这段时间一直在研究hdmi-servers,因为友善对这个在是闭源的,所以由于兴趣的关系和工作的关系,决定自己写一个hdmi-servers. 在hdmi中,最关键的是弄清楚了Hdmi显示数据的怎么来 ...
- C#接口之IEnumerable,IEnumerator
IEnumerable 截图来源于https://msdn.microsoft.com/zh-cn/library/system.collections.ienumerable.getenumerat ...
- Unity+高通Vuforia SDK——AR
一.AR概念: 增强现实(Augmented Reality,简称AR),是在虚拟现实的基础上发展起来的新技术,也被称之为混合现实.是通过计算机系统提供的信息增加用户对现实世界感知的技术,将虚拟的信息 ...
- 下载安装JDK,并且配置java环境变量
如果想使用java语言编写程序,就必须搭建一个java开发环境,需要安装jdk,然后配置环境变量. 一:下载jdk 现在的jdk主流的是sun公司的jdk,当然IBM和其他一些商业公司都开发有自己的j ...
- Cocos2d-x 3.0 Lua编程 之 响应Android手机的按键
演示样例代码例如以下所看到的: local listenerKey= cc.EventListenerKeyboard:create() local function onKeyReleaseed(k ...
- 将Spring源代码导入eclipse步骤
深入学习spring.研读源代码是必须的~ 1.到https://github.com/spring-projects/spring-framework/releases去找自己须要的spring版本 ...
- ASP------<iframe>标签如何去掉滚动条
代码: <iframe src="../Home/Thanks" width="100%" height="500" scrollin ...
- Ubuntu 建立桌面快捷方式
非常多时候,在Ubuntu下软件能够通过命令安装.可是有时候比較方便的方法就是下载一个压缩包,解压就能够使用了. 可是每次使用都要先跳到解压文件夹.这就比較麻烦.所以能够通过创建桌面快捷方式来解决问题 ...
- 超全面的JavaWeb笔记day22<文件上传>
文件上传概述 1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2 文件上传对页面的要求 上传文件的要求比较多,需要记一下: 1. 必须使用 ...
- python 协程(单线程中的异步调用)(转廖雪峰老师python教程)
协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在 ...