Python爬虫基础之requests

一、随时随地爬取一个网页下来

  怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等。我们之前用的是Python标准基础库Urllib实现的,

现在我们使用Python的Requests HTTP库写个脚本开始爬取网页。Requests的口号很响亮“让HTTP服务人类“,够霸气。

二、Python Requests库的基本使用

1.GET和POST请求方式

GET请求

1 import requests
2
3 payload = {"t": "b", "w": "Python urllib"}
4 response = requests.get(‘http://zzk.cnblogs.com/s‘, params=payload)
5 # print(response.url)  # 打印 http://zzk.cnblogs.com/s?w=Python+urllib&t=b&AspxAutoDetectCookieSupport=1
6 print(response.text)  

Python requests的GET请求,不需要在作为请求参数前,对dict参数进行urlencode()和手动拼接到请求url后面,get()方法会直接对params参数这样做。

POST请求

1 import requests
2
3 payload = {"t": "b", "w": "Python urllib"}
4 response = requests.post(‘http://zzk.cnblogs.com/s‘, data=payload)
5 print(response.text)  # u‘......‘

Python requests的POST请求,不需要在作为请求参数前,对dict参数进行urlencode()和encode()将字符串转换成字节码。raw属性返回的是字节码,text属性直接返回unicode格式的字符串,而不需要再进行decode()将返回的bytes字节码转化为unicode。

相对于Python urllib而言,Python requests更加简单易用。

 2.设置请求头headers

1 import requests
2
3 payload = {"t": "b", "w": "Python urllib"}
4 headers = {‘user_agent‘:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36‘}
5 response = requests.get(‘http://zzk.cnblogs.com/s‘, params=payload, headers=headers)
6 print(response.request.headers)  

get方法的请求头,可以通过传递字典格式的参数给headers来实现。response.headers返回服务器响应的请求头信息,response.request.headers返回客户端的请求头信息。

3.设置会话cookie

1 import requests
2
3 cookies = {‘cookies_are‘: ‘working‘}
4 response = requests.get(‘http://zzk.cnblogs.com/‘, cookies=cookies)
5 print(response.text)

requests.get()方法cookies参数除了支持dict()字典格式,还支持传递一个复杂的RequestsCookieJar对象,可以指定域名和路径属性。

1 import requests
2 import requests.cookies
3
4 cookieJar = requests.cookies.RequestsCookieJar()
5 cookieJar.set(‘cookies_are‘, ‘working‘, domain=‘cnblogs‘, path=‘/cookies‘)
6 response = requests.get(‘http://zzk.cnblogs.com/‘, cookies=cookieJar)
7 print(response.text)

4.设置超时时间timeout

1 import requests
2
3 response = requests.get(‘http://zzk.cnblogs.com/‘, timeout=0.001)
4 print(response.text)

三、Python Requests库的高级使用

1.Session Object

1 from requests import Request,Session
2
3 s = Session()
4
5 s.get(‘http://httpbin.org/cookies/set/sessioncookie/123456789‘)
6 r = s.get(‘http://httpbin.org/cookies‘)
7
8 print(r.text)
9 # ‘{"cookies": {"sessioncookie": "123456789"}}‘

通过Session,我们可以在多个请求之间传递cookies信息,不过仅限于同一域名下,否则不会附带上cookie。如果碰到需要登录态的页面,我们可以在登陆的时候保存登录态,再访问其他页面时附带上就好。

2.Prepared Requested

 1 from requests import Request,Session
 2
 3 url = ‘http://zzk.cnblogs.com/s‘
 4 payload = {"t": "b", "w": "Python urllib"}
 5 headers = {
 6         ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36‘,
 7         ‘Content-Type‘:‘application/x-www-form-urlencoded‘
 8 }
 9 s = Session()
10 request = Request(‘GET‘, url, headers=headers, data=payload)
11 prepped = request.prepare()
12
13 # do something with prepped.headers
14 del prepped.headers[‘Content-Type‘]
15 response = s.send(prepped, timeout=3)
16 print(response.request.headers)

Request对象的prepare()方法返回的对象允许在发送请求前做些额外的工作,例如更新请求体body或者请求头headers.

四、Python Requests库的实际应用

 1.GET请求封装

 1 def do_get_request(self, url, headers=None, timeout=3, is_return_text=True, num_retries=2):
 2         if url is None:
 3             return None
 4         print(‘Downloading:‘, url)
 5         if headers is None:  # 默认请求头
 6             headers = {
 7                 ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36‘}
 8         response = None
 9         try:
10             response = requests.get(url,headers=headers,timeout=timeout)
11
12             response.raise_for_status()  # a 4XX client error or 5XX server error response,raise requests.exceptions.HTTPError
13             if response.status_code == requests.codes.ok:
14                 if is_return_text:
15                     html = response.text
16                 else:
17                     html = response.json()
18             else:
19                 html = None
20         except requests.Timeout as err:
21             print(‘Downloading Timeout:‘, err.args)
22             html = None
23         except requests.HTTPError as err:
24             print(‘Downloading HTTP Error,msg:{0}‘.format(err.args))
25             html = None
26             if num_retries > 0:
27                 if 500 <= response.status_code < 600:
28                     return self.do_get_request(url, headers=headers, num_retries=num_retries - 1)  # 服务器错误,导致请求失败,默认重试2次
29         except requests.ConnectionError as err:
30             print(‘Downloading Connection Error:‘, err.args)
31             html = None
32
33         return html

2.POST请求封装

 1  def do_post_request(self, url, data=None, headers=None, timeout=3, is_return_text=True, num_retries=2):
 2         if url is None:
 3             return None
 4         print(‘Downloading:‘, url)
 5         # 如果请求数据未空,直接返回
 6         if data is None:
 7             return
 8         if headers is None:
 9             headers = {
10                 ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36‘}
11         response = None
12         try:
13             response = requests.post(url,data=data, headers=headers, timeout=timeout)   # 设置headers timeout无效
14
15             response.raise_for_status()  # a 4XX client error or 5XX server error response,raise requests.exceptions.HTTPError
16             if response.status_code == requests.codes.ok:
17                 if is_return_text:
18                     html = response.text
19                 else:
20                     html = response.json()
21             else:
22                 print(‘else‘)
23                 html = None
24         except requests.Timeout as err:
25             print(‘Downloading Timeout:‘, err.args)
26             html = None
27         except requests.HTTPError as err:
28             print(‘Downloading HTTP Error,msg:{0}‘.format(err.args))
29             html = None,
30             if num_retries > 0:
31                 if 500 <= response.status_code < 600:
32                     return self.do_post_request(url, data=data, headers=headers,
33                                                 num_retries=num_retries - 1)  # 服务器错误,导致请求失败,默认重试2次
34         except requests.ConnectionError as err:
35             print(‘Downloading Connection Error:‘, err.args)
36             html = None
37
38         return html

3.登录态cookie

 1 def save_cookies(self, requeste_cookiejar, filename):
 2     with open(filename, ‘wb‘)as f:
 3         pickle.dump(requeste_cookiejar, f)
 4
 5 def load_cookies(self, filename):
 6     with open(filename, ‘rb‘) as f:
 7         return pickle.load(f)
 8
 9 # save request cookies
10 r = requests.get(url)
11 save_cookies(r.cookies,filename)
12
13 # load cookies and do a request
14 requests.get(url,cookies=load_cookies(filename))
时间: 2024-10-10 14:01:02

Python爬虫基础之requests的相关文章

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

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

Python 爬虫基础

下面是一个 Python 爬虫最简单的例子,使用网络库 urllib2 和正则表达式库 re,模拟浏览器的 User-Agent. #!/usr/bin/env python # -*- coding: utf-8 -*- #引入基础网络库 import urllib2 #引入正则表达式模块 import re #模拟User-Agent headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWe

Python 爬虫入门(requests)

相信最开始接触Python爬虫学习的同学最初大多使用的是urllib,urllib2.在那之后接触到了第三方库requests,requests完全能满足各种http功能,真的是好用爆了 :D 他们是这样说的: “Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用.Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动.你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码.Keep-alive 和 HTTP

爬虫基础之Requests

requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器

Python爬虫基础知识及前期准备

学习爬虫有一小段时间了,于是决定把自己学爬虫时所学的,写过的代码以及看过的文档记录下来,权当小结.第一次写这些,如果有错误,请多指教. 首先我们需要了解一下什么是爬虫. 根据百度百科上给出的定义," 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本."简单来说,爬虫类似手动下载网页信息,比如小说.歌曲.说到这,或许会有疑问,既然这样,干嘛还去敲代码,直接人工处理不好吗?话是这么说,但如果下载的

爬虫基础之requests模块

1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互联网的世界里最有价值的便是数据, 谁掌握了某个行业的行业内的第一手数据, 谁就是该行业的主宰. 掌握了爬虫技能, 你就成了所有互联网信息公司幕后的老板, 换言之,它们都在免费为你提供有价值的数据. 1.3 robots.txt协议 如果自己的门户网站中的指定页面中的数据不想让爬虫程序爬取到的话,那么

python爬虫基础02-urllib库

Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib. 官方文档链接为:https://docs.python.org/3/library/urllib.html 而urllib3则是增加了连接池等功能,两者互相都有补充的部分. urllib 它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,基本上涵盖了基础的网络请

Python爬虫基础教程,手把手教你爬取拉勾网!

一.思路分析: 在之前写拉勾网的爬虫的时候,总是得到下面这个结果(真是头疼),当你看到下面这个结果的时候,也就意味着被反爬了,因为一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会禁止这个IP的访问: 对于拉勾网,我们要找到职位信息的ajax接口倒是不难(如下图),问题是怎么不得到上面的结果. 要想我们的爬虫不被检测出来,我们可以使用代理IP,而网上有很多提供免费代理的网站,比如西刺代理.快代理.89免费代理等等,我

Python爬虫基础知识入门一

一.什么是爬虫,爬虫能做什么 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.比如它在抓取一个网页,在这个网中他发现了一条道路,其实就是指向网页的超链接,那么它就可以爬到另一张网上来获取数据. 爬虫可以抓取的某个网站或者某个应用的内容,提取有用的价值.也可以模拟用户在浏览器或者App应用上的操作,实现自动化的程序.以下行为都可以用爬虫实现: 咨询报告(咨询服务行业) 抢票神器 投票神器 预测(