2018-03-19 Python 宅必备




好久没更新Python相关的内容了,这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分

上节我们说了如何操作浏览器自动订购12306火车票



这节内容为如何利用fiddler分析登陆过程并使用requests进行登陆51cto,之后领取下载豆


## 开发环境

操作系统:windows 10

Python版本 :3.6

爬取网页模块:requests

分析网页工具:BeautifulSoup4,fiddler4

## 关于requests

requests是一个第三方库,可以用来模拟浏览器请求,如get,post

它也有Session功能,可以保持会话信息,如cookie等,这个可以让我们用来进行登陆后的操作

具体请参加官网:

[http://docs.python-requests.org/en/master/](http://docs.python-requests.org/en/master/)

## 关于fiddler4

fiddler4 是一个网页分析的工具,和自带的开发者工具一样,不过其功能更为强大

我们可以通过官网免费下载并使用

官方网址

[https://www.telerik.com/download/fiddler](https://www.telerik.com/download/fiddler)

详细教程查看如下网站

[http://docs.telerik.com/fiddler/configure-fiddler/tasks/configurefiddler
](http://docs.telerik.com/fiddler/configure-fiddler/tasks/configurefiddler
)

## 模块安装

```
lxml为解析网页所必需

pip3 install requests

pip3 install BeautifulSoup4

pip3 install lxml
```

## 1.分析过程

### 1.1 登陆51cto并进行登陆

请保持fiddle4 全程开启状态


[image:91 size:orig]



### 1.2 使用Fiddler4 查找功能查找登陆页面

也可以直接使用快捷键Ctrl+F,我们这里查找用户名bsbforever

注意这里需要勾选decode compressed content

[image:92 size:orig]


之后可以看到界面左边连接黄色高亮

[image:93 size:orig]



### 1.3 查看请求网页和header

[image:94 size:orig]

### 1.4 查看POST请求参数

接下来我们双击该页面从右侧的WebForms查看POST参数

[image:95 size:orig]


也可以查看raw标签

[image:96 size:orig]


从上面我们可以看出提交的信息有:

- _csrf

- username

- password

- rememberme

- login_button


其他都很好知道其含义,只有第一个我们不确定其含义

我们接下来重复登陆操作,可以看到每次csrf值是不一样的

这时我们需要找到该值是如何产生的

### 1.5 查看csrf值

这里我们仍然使用搜索功能,我们搜索csrf的值

这时我们可以看到左侧有2处标黄,我们查看另外个页面的响应

[image:97 size:orig]


可以看到该csrf值存在于为登陆前的页面中

这时我们可以提取该值

### 1.6 POST模拟登陆

接下来我们构造header和post data 使用requests.post进行登陆

这时使用Session方法保持绘画信息

### 1.7 登陆后领取下载豆

这里根据抓取到的页面进行POST请求


## 2. 登陆流程图

[image:98 size:orig]


## 3. 代码介绍

### 3.1 import相关的模块

···
import requests

from bs4 import BeautifulSoup

···


### 3.2 新建requests会话

后续都使用s变量进行请求

···
s=requests.Session()
···

### 3.3  get首页获取csrf值

···
content=s.get('http://home.51cto.com/home').content

soup = BeautifulSoup(content,"lxml")

token=soup.find('meta',attrs = {'name' : 'csrf-token'})['content']
···



### 3.4 构造header和data

```
 header={
    'Connection': 'keep-alive',
        'Host': 'home.51cto.com',
        'Origin': 'http://home.51cto.com',
        'Referer':'http://home.51cto.com/index',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
    }
    data={
        '_csrf':token,
        'LoginForm[username]':'username',
   'LoginForm[password]': 'password',
    'LoginForm[rememberMe]': '0',
    'login-button': '登 录'
    }
```

### 3.5 post 登陆页面

···
s.post(url=login_url,headers=header,data=data)
···


### 3.6 判断是否登陆成功

```
result=s.get('http://home.51cto.com/home').text

if 'bsbforever' in result:

    print ('恭喜,登陆51cto成功,领取下载豆中..')
```



### 3.7.领取下载豆
```
 download=s.post('http://down.51cto.com/download.php?do=getfreecredits&t=0.8367867217711695').text
```

## 4.执行结果:

[image:100 size:orig]

## 5.注意事项:

- fiddler请保持全程开启

- 请使用Session方法保持登陆状态

- 本脚本仅用于学习用途

## 6.源码位置

源码请访问我的github主页也可点击阅读全文:

[ https://github.com/bsbforever/spider/blob/master/login_web.py]( https://github.com/bsbforever/spider/blob/master/login_web.py)