自学python Day3 - Requests库 - 2018.5.1

本文介绍了使用Python进行网络爬虫的基本方法,包括如何利用Requests库发起GET和POST请求,解析响应内容,处理Cookies和会话,以及使用代理服务器避免IP被封等问题。

之前大致过了一下用python自带库写爬虫,现在着重学习 请求库:Requests库 和 解析库:BS4

Requests库的学习路径依然是之前的哪个帖子 https://zhuanlan.zhihu.com/p/24358829

这个帖子的gitbook连接失效,打开标题的连接 https://germey.gitbooks.io/python3webspider/content/


2.4 session和cookies

3. Cookies
会话维持
那么利用 Cookies 我们是怎样来保持状态的呢?当客户端第一次请求服务器时,服务器会返回一个 Headers 中带有 Set-Cookie 字段的 Response 给客户端,用来标记是哪一个用户,客户端浏览器会把Cookies 保存起来。当浏览器下一次再请求该网站时,浏览器会把此Cookies 放到 Request Headers 一起提交给服务器,Cookies 携带了 Session ID 信息,服务器检查该 Cookies 即可找到对应的 Session 是什么,然后再判断 Session 来以此来辨认用户状态。
属性结构

  • Name,即该 Cookie 的名称。Cookie 一旦创建,名称便不可更改
  • Value,即该 Cookie 的值。如果值为 Unicode 字符,需要为字符编码。如果值为二进制数据,则需要使用 BASE64 编码。
  • Max Age,即该 Cookie 失效的时间,单位秒,也常和 Expires 一起使用,通过它可以计算出其有效时间。Max Age 如果为正数,则该Cookie 在 Max Age 秒之后失效。如果为负数,则关闭浏览器时Cookie 即失效,浏览器也不会以任何形式保存该 Cookie。
  • Path,即该 Cookie 的使用路径。如果设置为 /path/,则只有路径为 /path/ 的页面可以访问该 Cookie。如果设置为 /,则本域名下的所有页面都可以访问该 Cookie。
  • Domain,即可以访问该 Cookie 的域名。例如如果设置为 .zhihu.com,则所有以 zhihu.com,结尾的域名都可以访问该Cookie。
  • Size字段,即此 Cookie 的大小。
  • Http字段,即 Cookie 的 httponly 属性。若此属性为 true,则只有在 HTTP Headers 中会带有此 Cookie 的信息,而不能通过 document.cookie 来访问此 Cookie。
  • Secure,即该 Cookie 是否仅被使用安全协议传输。安全协议。安全协议有 HTTPS,SSL 等,在网络上传输数据之前先将数据加密。默认为 false。
2.5 代理基本原理

防止封IP

4. 代理分类

代理分类时可以根据协议区分也可以根据其匿名程度区分,下面分别总结如下:

根据协议区分

根据代理的协议区分,代理可以分为如下类别:

  • FTP 代理服务器,主要用于访问 FTP 服务器,一般有上传、下载以及缓存功能,端口一般为 21、2121 等。
  • HTTP 代理服务器,主要用于访问网页,一般有内容过滤和缓存功能,端口一般为 80、8080、3128 等。
  • SSL/TLS 代理,主要用于访问加密网站,一般有 SSL 或 TLS 加密功能(最高支持 128 位加密强度),端口一般为 443。
  • RTSP 代理,主要用于 Realplayer 访问 Real 流媒体服务器,一般有缓存功能,端口一般为 554。
  • Telnet代理,主要用于 telnet 远程控制(黑客入侵计算机时常用于隐藏身份),端口一般为23。
  • POP3/SMTP 代理,主要用于 POP3/SMTP 方式收发邮件,一般有缓存功能,端口一般为 110/25。
  • SOCKS代理,只是单纯传递数据包,不关心具体协议和用法,所以速度快很多,一般有缓存功能,端口一般为1080。SOCKS 代理协议又分为 SOCKS4 和 SOCKS5,SOCKS4 协议只支持 TCP,而 SOCKS5 协议支持 TCP 和 UDP,还支持各种身份验证机制、服务器端域名解析等。简单来说,SOCK4能做到的SOCKS5都可以做到,但SOCKS5能做到的SOCK4不一定能做到。
根据匿名程度区分

根据代理的匿名程度划分,代理可以分为如下类别:

  • 高度匿名代理,高度匿名代理会将数据包原封不动的转发,在服务端看来就好像真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
  • 普通匿名代理,普通匿名代理会在数据包上做一些改动,服务端上有可能发现这是个代理服务器,也有一定几率追查到客户端的真实 IP。代理服务器通常会加入的 HTTP 头有 HTTP_VIA 和 HTTP_X_FORWARDED_FOR。
  • 透明代理,透明代理不但改动了数据包,还会告诉服务器客户端的真实 IP。这种代理除了能用缓存技术提高浏览速度,能用内容过滤提高安全性之外,并无其他显著作用,最常见的例子是内网中的硬件防火墙。
  • 间谍代理,间谍代理指组织或个人创建的,用于记录用户传输的数据,然后进行研究、监控等目的代理服务器
5. 常见代理设置
  • 使用网上的免费代理,最好使用高匿代理,使用前抓取下来筛选一下可用代理,也可以进一步维护一个代理池。
  • 使用付费代理服务,互联网上存在许多代理商,可以付费使用,质量比免费代理好很多。
  • ADSL拨号,拨一次号换一次 IP,稳定性高,也是一种比较有效的解决方案。

3.1 使用Urllib

Urllib 库,它是 Python 内置的 HTTP 请求库,它包含四个模块

  • 第一个模块 request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
  • 第二个 error 模块即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
  • 第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
  • 第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。


3.2 使用requests
3.2.1 基本使用

3. GET请求

参数

import requests

r = requests.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text)
print(r.cookies)
附加额外的信息:params 这个参数
import requests

data = {
    'name': 'germey',
    'age': 22
}
r = requests.get("http://httpbin.org/get", params=data)
print(r.text)

网页的返回类型实际上是 str 类型,但是它很特殊,是 Json 的格式,所以如果我们想直接把返回结果解析,得到一个字典格式的话,可以直接调用 json() 方法。

import requests

r = requests.get("http://httpbin.org/get")
print(type(r.text))
print(r.json())
print(type(r.json()))


抓取网页

以知乎-发现页面为例来感受一下:

import requests
import re

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
r = requests.get("https://www.zhihu.com/explore", headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re.S)
titles = re.findall(pattern, r.text)
print(titles)
抓取二进制数据
以 GitHub 的站点图标为例来感受一下:
import requests

r = requests.get("https://github.com/favicon.ico")
with open('favicon.ico', 'wb') as f:    
    f.write(r.content)
如果返回结果是图片、音频、视频等文件,Requests 会为我们自动解码成 bytes 类型,即获取字节流数据。

在这里用了 open() 方法,第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件里写入二进制数据,然后保存。

添加Headers

如果不传递 Headers,有可能会被服务器识别出来

4. POST请求

模拟表单提交,将一些数据提交到某个链接。

import requests

data = {'name': 'germey', 'age': '22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)

5. Response



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值