首页 > 技术文章 > 金利道利用python的requests库写爬虫

jinlidao 2019-10-29 14:53 原文

 

一、实验目的

1、认识Python的requests库

2、理解抓包分析和模拟登录原理

二、实验内容

1、安装Python

2、使用Python进行网页抓取

3、使用带请求头的requests请求抓取网页

4、实现模拟登录

三、实验要求

1、人员组织

以小组为单元进行实验,每小组5人,小组自协商选一位组长,由组长安排和分配实验任务,具体参加实验内容中实验过程。

 

2、环境要求

python-3.6.4-amd64.exe

python-3.6.4.exe

四、准备知识

1、爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

2、HTTP

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

某些网站会根据HTTP请求头的参数,确定此请求是否来自爬虫,例如userAgent这个参数,普通爬虫的参数是python-requests/2.11.0。

3、Cookies

Cookies一词用在程序设计中是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。从本质上讲,它可以看作是你的身份证。保存的信息片断以"名/值"对(name-value pairs)的形式储存,一个"名/值"对仅仅是一条命名的数据。

一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookies文件中取得信息,也无法得到你的电脑上的其它任何东西。 Cookies中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。

由于Cookies可被Javascript程序方便修改,并且多数Javascript程序可做复杂程序结构的混淆,Cookies经常被用于阻击无JS内核爬虫,并且防止程序员过快破解Cookies加密机制。此外,Cookies还被用于甄别不同的登录用户。

 

五、实验步骤

1、安装Python

在https://www.python.org/downloads/release/python-364/ 最底端找到对应的下载文件(标明executable installer的链接)下载。

 

 

若官方网站下载偏慢,可到国内镜像:https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fpython 找到python-3.6.0.exe或python-3.6.0-amd64.exe(若系统为64位系统)下载。

打开文件后,选中Add Python3.6 to PATH,进入customize installation,在如下界面全选安装选项。

 

 

 点击next,再点击install,安装程序就会自动把需要的全部配置好。

2、使用requests库下载网页代码

先在cmd输入pip install requests,确认安装好requests库。

在任意位置创建crawler1.py,输入如下代码:

 

 

 在cmd使用cd命令定位到文件位置,运行python crawler1.py,即可在控制台查看北京大学OJ的网页代码。

 

 北京大学OJ对于爬虫的防护几乎没有,无特定请求头可以正常访问。

3、在请求头增加参数以下载网页代码

在任意位置创建crawler2.py,输入如下代码:

import requests

head = {

    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

    'Accept-Encoding': 'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.8','Cache-control':'no-cache',

'Connection':'keep-alive','Host':'www.sohu.com','Pragma':'no-cache','Upgrade-Insecure-Requests':'1',

'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'

}

res = requests.get('http://www.sohu.com',headers=head)

print(res.text)

在cmd使用cd命令定位到文件位置,运行python crawler2.py,即可在控制台查看搜狐门户网站的网页代码。

 

 

 搜狐门户网站对请求做了初级过滤,user-agent值不是正常的浏览器该有的值就会返回404错误,必须把请求头修改为接近浏览器的请求头。

4、利用Cookies实现模拟登录

此步骤需要使用浏览器进行抓包,以方便请求分析。

以chrome浏览器为例, 使用chrome访问poj.org,右上角有登录页面,输入User ID为funcfans,Password为dgutflyfly,键入F12键打开调试界面,点击Network选项卡进入抓包界面,选上Preserve log。

点击右上角的login按钮,查看抓包结果。可以发现,提交的表单内容与输入的内容是一致的。像北大OJ这种没爬虫防御的系统,后2个参数服务器不会检查(注意:chrome的59和61版本看不到302状态码的表单,此处用60版本)

 由于登录信息与Cookies有关系,需要对Cookies进行查询分析。点击Cookies选项卡,可看到request(发出方)有多个参数,response(接收方)没有发送参数。一般来说,只有JSESSIONID的内容是有效的。

 

 

 

 

之后把代码写入任意路径下的crawler3.py:

 

 

       进入cmd,cd命令到对应路径下运行python crawler3.py,搜索账号名称可以看到如下结果:

 

 

       观察到此结果,说明登录成功。

       注意:某些网站的登录步骤比北大OJ复杂,并且需要追踪JS代码。需要其他网站的模拟登录,可以参考 https://github.com/xchaoinfo/fuck-login。

六、总结

本实验通过使用Python对网站数据进行抓取,以及利用浏览器的抓包工具和UA插件抓包分析,了解爬虫抓取数据的基本工作原理,学会浏览器的插件、浏览器的抓包工具和Python的requests库的简单使用。

推荐阅读