博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python爬虫:认识urllib/urllib2以及requests
阅读量:6672 次
发布时间:2019-06-25

本文共 4519 字,大约阅读时间需要 15 分钟。

首先说明一下我的爬虫环境是基于py2.x的, 为什么用这个版本呢,因为py2.x的版本支持的多,而且一般会使用py2.x环境,基本在py3.x也没有太大问题,好了,进入正题!

urllib 与 urllib2

urlliburllib2是Python内置的,要实现Http请求,以urllib2为主,urllib为辅.

构建一个请求与响应模型

import urllib2strUrl = "http://www.baidu.com"response = urllib2.urlopen(strUrl)print response.read()
得到:

这样就获取了整个网页内容.

说明
urlopen(strUrl,data,timeout)

  • 第一个参数URL必传的,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间,后面两个参数不是必传的.

Get与Post传送数据

post与get传送数据是两个比较常用的数据传送方式,一般只需要掌握这两种方式就可以了.

Get方式传送数据

import urllib2import urllibvalues = {}values['username'] = '136xxxx0839'values['password'] = '123xxx'data = urllib.urlencode(values)#这里注意转换格式url = 'https://accounts.douban.com/login?alias=&redir=https%3A%2F%2Fwww.douban.com%2F&source=index_nav&error=1001'getUrl = url+'?'+datarequest = urllib2.Request(getUrl)response = urllib2.urlopen(request)# print response.read()print getUrl得到:https://accounts.douban.com/login?alias=&redir=https%3A%2F%2Fwww.douban.com%2F&source=index_nav&error=1001?username=136xxxx0839&password=123xxx

post数据传送方式

values = {}values['username'] = '136xxxx0839'values['password'] = '123xxx'data = urllib.urlencode(values)url = 'https://accounts.douban.com/login?alias=&redir=https%3A%2F%2Fwww.douban.com%2F&source=index_nav&error=1001'request = urllib2.Request(url,data)response = urllib2.urlopen(request)print response.read()

两种请求方式差异点:

postrequest方式的数据传输时注意urllib2.Request(url,data)这里面的数据传输

注意处理请求的headers

很多时候我们服务器会检验请求是否来自于浏览器,所以我们需要在请求的头部伪装成浏览器来请求服务器.一般做请求的时候,最好都要伪装成浏览器,防止出现拒绝访问等错误,这也是一种反爬虫的一种策略

user_agent = {'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4295.400 QQBrowser/9.7.12661.400'}header = {'User-Agent':user_agent}url = 'http://www.qq.com/'request = urllib2.Request(url,headers=header)response = urllib2.urlopen(request)print response.read().decode('gbk')#这里注意一下需要对读取的网页内容进行转码,先要查看一下网页的chatset是什么格式.

在浏览器上打开www.qq.com然后按F12,查看User-Agent:

User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求

Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
application/json : 在 JSON RPC 调用时使用
application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用
在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务

requests

requests是Python最为常用的http请求库,也是极其简单的.使用的时候,首先需要对requests进行安装,直接使用Pycharm进行一键安装。

1.响应与编码
import requestsurl = 'http://www.baidu.com'r = requests.get(url)print type(r)print r.status_codeprint r.encoding#print r.contentprint r.cookies得到:
200ISO-8859-1
]>
2.Get请求方式
values = {'user':'aaa','id':'123'}url = 'http://www.baidu.com'r = requests.get(url,values)print r.url得到:http://www.baidu.com/?user=aaa&id=123
3.Post请求方式
values = {'user':'aaa','id':'123'}url = 'http://www.baidu.com'r = requests.post(url,values)print r.url#print r.text得到:http://www.baidu.com/
4.请求头headers处理
user_agent = {'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4295.400 QQBrowser/9.7.12661.400'}header = {'User-Agent':user_agent}url = 'http://www.baidu.com/'r = requests.get(url,headers=header)print r.content
5.响应码code与响应头headers处理
url = 'http://www.baidu.com'r = requests.get(url)if r.status_code == requests.codes.ok:    print r.status_code    print r.headers    print r.headers.get('content-type')#推荐用这种get方式获取头部字段else:    r.raise_for_status()得到:200{'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Server': 'bfe/1.0.8.18', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:57 GMT', 'Connection': 'Keep-Alive', 'Pragma': 'no-cache', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Date': 'Wed, 17 Jan 2018 07:21:21 GMT', 'Content-Type': 'text/html'}text/html
6.cookie处理
url = 'https://www.zhihu.com/'r = requests.get(url)print r.cookiesprint r.cookies.keys()得到:
]>['aliyungf_tc']
7重定向与历史消息

处理重定向只是需要设置一下allow_redirects字段即可,将allow_redirectsy设置为True则是允许重定向的,设置为False则禁止重定向的

r = requests.get(url,allow_redirects = True)print r.urlprint r.status_codeprint r.history得到:http://www.baidu.com/200[]
8.超时设置

超时选项是通过参数timeout来设置的

url = 'http://www.baidu.com'r = requests.get(url,timeout = 2)
9.代理设置
proxis = {    'http':'http://www.baidu.com',    'http':'http://www.qq.com',    'http':'http://www.sohu.com',}url = 'http://www.baidu.com'r = requests.get(url,proxies = proxis)

转载于:https://blog.51cto.com/7200087/2070304

你可能感兴趣的文章
Tomcat 7最大并发连接数的正确修改方法(转)
查看>>
开源分布式任务调度平台Cuckoo-Schedule
查看>>
20170224测试数据库块在文件系统缓存多少
查看>>
Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入? (转)
查看>>
微信小程序把玩(十一)icon组件
查看>>
当计算停留着网格内 Mellanox用智能网络助跑AI
查看>>
有个想法,想吧LNMP和NGINX和HAPROXY都放到docker里做集群,大家觉得怎么样?
查看>>
关于PWA落地问题的思考
查看>>
Nagios利用NSClient++监控Windows主机
查看>>
从高性能计算到人工智能—GPU的加速能力得到广泛认同
查看>>
Apache Replication主从复制同步机制实践
查看>>
JBoss 6.1安装配置问题
查看>>
FreeType in OpenCASCADE
查看>>
Facebook、中国BAT均落选,高盛全球“漂亮50”有哪些潜力股?
查看>>
一个人的 Android 开发
查看>>
Emacs之魂(五):变量的“指针”语义
查看>>
如何从 Angular 1.x 无缝升级到 Angular 2
查看>>
国内首次云计算CRM公测反响良好
查看>>
他俩窃取了34个共享单车账户,两天挣了2万多
查看>>
Half-Life's In-Game Visibility Determination
查看>>