0%

python 爬虫 入门

用 python 爬虫 来爬取网页信息是非常方便的!

开始玩爬虫,咔嚓咔嚓~

小虫子,大虫子,你怕不怕! ps:Python版本2.78.

本文由hrwhisper原创,转载请点明出处(https://www.hrwhisper.me/?p=1100)

2015.5.3更新:

  • 不再使用urllib,改用更为简洁、速度更快的requests。

 

一、课前准备

(一)爬虫技术简介

什么是网络爬虫?

百度百科上这么写:网络爬虫(又被称为网页蜘蛛),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。

通俗的说,就是获取网页内容的技术。比如,网页中的文字、图片。

它还可以从一个网页到另外一个网页(广搜、深搜等),就像在互联网这个大蜘蛛网上爬来爬去一样。

可以说,就是爬取网页的源代码,从中获取我们需要的内容。(如文字、图片、其他文件等)

(二)HTTP通信过程

Http是一个基于请求/响应模式的,无状态的协议,它是建立在TCP的基础上的。

具体过程如下:

  1. 建立TCP连接
  2. Web浏览器向Web服务器发送请求
  3. Web浏览器发送请求头信息
  4. Web服务器应答
  5. Web服务器发送应答头信息
  6. Web服务器向浏览器发送数据
  7. Web服务器关闭TCP连接

简单的说,就是

  1. 建立TCP连接
  2. 浏览器发送请求
  3. 服务器回应请求
  4. 关闭TCP连接

 

(三)URL和URI

Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 都由 由一个统一资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。

URL:统一资源定位符

URI:统一资源标识符

URL是URI的一个子集。URL必须指明如何获取这个资源。如HTTP,FTP等

二、python简单的爬虫

 

(一)最简单的网页爬虫

一个简单的爬虫如下:

回想一下刚才介绍的HTTP的通信过程,我们用get方法发送request请求,而它将返回一个response,这个response对象的text即为html源代码

1
2
3
import requests
response = requests.get('http://hrwhisper.me')
print response.text

 

(二)get和post

http中,不得不说的就是get和post.

简单的说,get就是通过url把参数发给服务器,而Post是写在header中的。

get简单的实现,即在Url后加参数。

PS:在下面这两个例子,仅仅是例子而已,直接运行会出错,因为服务器不认你的。在实际应用中,请把url改成你需要的。

GET例子

1
2
3
4
5
6
7
import requests
data ={
'name':'hrwhisper',
'blog':'hrwhisper.me'
}
r = requests.get('http://hrwhisper.me',params=data)
print r.text

POST例子

1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*-
import requests
data ={
'name':'hrwhisper',
'blog':'hrwhisper.me'
}
r = requests.post('http://hrwhisper.me',data=data)
print r.text

可以看出:

要使用get方法,requests.get,参数为params

要使用post方法,requests.post,参数为data

对于 像12306这种证书错误或无效的的,直接get报错,怎么办呢?

把参数verify改为false即可

1
2
r = requests.get('https://kyfw.12306.cn/otn/login/init', verify=False)
print r.text

 

(三)通过设置header 伪造浏览器

我们来抓取下刚才post发出的包,可以看到User-Agent:Python-urllib/2.7

[caption id="attachment_1106" align="alignnone" width="362"]python post抓包 python post抓包[/caption]

User-Agent是什么呢?这是一个用来用户浏览器的标识。

比如 我的chrome浏览器的 User-Agent如下:

Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36

Firefox如下:

Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0

而往往有机智的服务器看到你只是个小蜘蛛,它果断不为你提供服务。

所以我们需要进行头部的伪装。

代码很简单,只要简单地传递一个 dict 给 headers 参数就可以了。(post和get都只需要加入headers属性!)

1
2
3
4
5
6
7
8
9
10
11
# -*- coding: utf-8 -*-
import requests
data ={
'name':'hrwhisper',
'blog':'hrwhisper.me'
}
myheader={
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36'
}
r = requests.post('http://hrwhisper.me',data=data,headers=myheader)
print r.text

我们再看看包,可以看到已经变成了chrome~

设置了header之后

当然,服务器可能还有许许多多的验证,如用referer来设置防盗链,我们也只需要加入头部即可。

如果你不知道要加入什么,最简单的办法就是用正常的浏览器去访问页面,抓包,然后头部抄正常浏览器的即可!

(四)Cookie

cookie是什么呢?

在程序中进行会话跟踪是很正常的一件事情,而我们知道,http是一个无状态的协议,一旦客户端和服务器交换完数据,连接就关闭,再次交换数据需要建立新的连接。这意味着服务器无法跟踪会话。

而cookie就是一个用于帮助跟踪会话的东西。

cookie的一个常用应用就是可以放入你的登陆信息,让你下次访问时不必重新输入用户名密码进行登陆。

需要注意的是它有不可跨域名性,即浏览器访问hrwhisper.me只会携带hrwhisper.me的cookie,不会携带baidu或者google的。(二级域名可以通过设置进行访问,默认情况下是不行的)

XSS攻击称为跨站脚本攻击,可以用来盗取别的域名的cookie。

好吧扯远了。

比如说,爬虫需要访问的内容,它需要登陆后才能进行访问,我们就需要使用到cookie记录我们登陆的信息。

一个简单的cookie使用如下,关建行我已经高亮标出来。

我们可以创建一个session对象,并且用这个session对象进行发送post或者get, Cookie的事情我们就不用管他了,可以自动的实现创建发送等。

而这个session对象的使用和前面的requests使用是一模一样的。

(具体的登陆后面我会有样例)

1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding: utf-8 -*-
import requests
data ={
'name':'hrwhisper',
'blog':'hrwhisper.me'
}
myheader={
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36'
}
s = requests.Session()
r = s.post('http://hrwhisper.me',data=data,headers=myheader)
print r.text

要拿出某个cookie的话,可以类似dict一样直接进行访问。

1
2
3
4
5
6
7
>>> url = 'hrwhisper.me'
>>> r = requests.get(url)

>>> r.cookies['example_cookie_name']
'example_cookie_value'


 

(五)响应状态码

1
2
3
4
# -*- coding: utf-8 -*-
import requests
r = requests.get('http://hrwhisper.me')
print r.status_code

 

(六)其他技巧

1.通过geturl()获取真实网址 - geturl()

一个网址可能被重定向到另外一个网址,比如Lofter首页上你自定义的外站连接。

如:http://hrsay.lofter.com/hrwhisper 就被重定向到https://www.hrwhisper.me/

我们怎么获取真实的网址呢?很简单,直接用返回的对象的url属性即可

1
2
3
import requests
r = requests.get('http://hrsay.lofter.com/hrwhisper')
print r.url

你会看到,输出为: https://www.hrwhisper.me/

2.查看获取页面的信息 - headers

查看页面的响应头

1
2
3
4
5
# -*- coding: utf-8 -*-
import requests
r = requests.get('http://hrsay.lofter.com/hrwhisper')
print r.headers
#print r.headers['content-type']

返回的是一个字典,你可以直接取出相应的字段

1
2
3
4
5
6
7
8
9
10
11
12
{
'content-length': '9321',
'content-encoding': 'gzip',
'vary': 'Accept-Encoding,User-Agent',
'keep-alive': 'timeout=2, max=100',
'server': 'Apache/2',
'connection': 'Keep-Alive',
'date': 'Sun, 03 May 2015 06:45:58 GMT',
'content-type': 'text/html;
'charset='UTF-8',
'x-pingback': 'https://www.hrwhisper.me/xmlrpc.php'
}

 

接下来你可以学习:

 

参考资料: http://www.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

请我喝杯咖啡吧~