Skip to content

Commit 158689e

Browse files
committed
test
0 parents  commit 158689e

File tree

1 file changed

+164
-0
lines changed

1 file changed

+164
-0
lines changed

ReadMe.md

+164
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# Python入门网络爬虫之精华版
2+
3+
Python学习网络爬虫主要分3个大的版块:**抓取****分析****存储**
4+
另外,比较常用的爬虫框架[Scrapy](http://scrapy.org/),这里最后也介绍一下。
5+
先列举一下相关参考:[宁哥的小站-网络爬虫](http://www.lining0806.com/category/spider/)
6+
***
7+
8+
## 抓取
9+
这一步,你要明确要得到的内容是是什么?是HTML源码,还是Json格式的字符串等等。
10+
11+
#### 1. 最基本的抓取
12+
一般属于get请求情况,直接从服务器上获取数据。
13+
首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,[requests](https://github.com/kennethreitz/requests)也是非常有用的包,与此类似的,还有[httplib2](https://github.com/jcgregorio/httplib2)等等。
14+
```
15+
Requests:
16+
import requests
17+
response = requests.get(url)
18+
content = requests.get(url).content # string
19+
print "response headers:", response.headers # dict
20+
print "content:", content
21+
Urllib2:
22+
import urllib2
23+
response = urllib2.urlopen(url)
24+
content = urllib2.urlopen(url).read() # string
25+
print "response headers:", response.headers # not dict
26+
print "content:", content
27+
Httplib2:
28+
import httplib2
29+
http = httplib2.Http()
30+
response_headers, content = http.request(url, 'GET')
31+
print "response headers:", response_headers # dict
32+
print "content:", content
33+
```
34+
此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。
35+
```
36+
data = {'data1':'XXXXX', 'data2':'XXXXX'} # dict类型
37+
Requests:data为dict,json
38+
import requests
39+
response = requests.get(url=url, params=data) # GET请求发送
40+
Urllib2:data为string
41+
import urllib, urllib2
42+
data = urllib.urlencode(data) # 编码工作,由dict转为string
43+
full_url = url+'?'+data # GET请求发送
44+
response = urllib2.urlopen(full_url)
45+
```
46+
47+
### 2. 对于反爬虫机制的处理
48+
** 2.1 模拟登陆情况 **
49+
这种属于post请求情况,先向服务器发送表单数据,服务器再将返回的cookie存入本地
50+
```
51+
data = {'data1':'XXXXX', 'data2':'XXXXX'} # dict类型
52+
Requests:data为dict,json
53+
import requests
54+
response = requests.post(url=url, data=data) # POST请求发送,可用于用户名密码登陆情况
55+
Urllib2:data为string
56+
import urllib, urllib2
57+
data = urllib.urlencode(data) # 编码工作,由dict转为string
58+
req = urllib2.Request(url=url, data=data) # POST请求发送,可用于用户名密码登陆情况
59+
response = urllib2.urlopen(req)
60+
```
61+
** 2.2 使用cookie登陆情况 **
62+
使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。
63+
```
64+
import requests
65+
requests_session = requests.session() # 创建会话对象requests.session(),可以记录cookie
66+
response = requests_session.post(url=url_login, data=data) # requests_session的POST请求发送,可用于用户名密码登陆情况。必须要有这一步!拿到Response Cookie!
67+
```
68+
若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下:
69+
```
70+
response_captcha = requests_session.get(url=url_login, cookies=cookies)
71+
response1 = requests.get(url_login) # 未登陆
72+
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
73+
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
74+
```
75+
相关参考:[网络爬虫-验证码登陆](http://www.lining0806.com/6-%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB-%E9%AA%8C%E8%AF%81%E7%A0%81%E7%99%BB%E9%99%86/)
76+
参考项目:[爬取知乎网站](https://github.com/lining0806/ZhihuSpider)
77+
** 2.3 伪装成浏览器,或者反“反盗链” **
78+
```
79+
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
80+
headers = {'Referer':'XXXXX'} # 反“反盗链”,适用于有“反盗链”的网站
81+
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
82+
Requests:
83+
response = requests.get(url=url, headers=headers)
84+
Urllib2:
85+
import urllib, urllib2
86+
req = urllib2.Request(url=url, headers=headers)
87+
response = urllib2.urlopen(req)
88+
```
89+
90+
### 3. 使用代理
91+
适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。
92+
```
93+
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
94+
Requests:
95+
import requests
96+
response = requests.get(url=url, proxies=proxies)
97+
Urllib2:
98+
import urllib2
99+
proxy_support = urllib2.ProxyHandler(proxies)
100+
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
101+
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
102+
response = urllib2.urlopen(url)
103+
```
104+
105+
### 4. 对于断线重连
106+
```
107+
def multi_session(session, *arg):
108+
while True:
109+
retryTimes = 20
110+
while retryTimes>0:
111+
try:
112+
return session.post(*arg)
113+
except:
114+
print '.',
115+
retryTimes -= 1
116+
```
117+
或者
118+
```
119+
def multi_open(opener, *arg):
120+
while True:
121+
retryTimes = 20
122+
while retryTimes>0:
123+
try:
124+
return opener.open(*arg)
125+
except:
126+
print '.',
127+
retryTimes -= 1
128+
```
129+
这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。
130+
131+
### 5. 多进程抓取
132+
这里针对[华尔街见闻](http://live.wallstreetcn.com/ )进行多进程的实验对比:[Python多进程抓取](https://github.com/lining0806/Spider_Python)[Java多进程抓取](https://github.com/lining0806/Spider)
133+
相关参考:[关于Python和Java的多进程多线程计算方法对比](http://www.lining0806.com/%E5%85%B3%E4%BA%8Epython%E5%92%8Cjava%E7%9A%84%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%A1%E7%AE%97%E6%96%B9%E6%B3%95%E5%AF%B9%E6%AF%94/)
134+
135+
### 6. 对于Ajax请求的处理
136+
对于“加载更多”情况,使用Ajax来传输很多数据。它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。
137+
这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程
138+
* 如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。
139+
* 对返回的json格式数据(str)进行正则匹配。json格式数据中,需从'\\uxxxx'形式的unicode_escape编码转换成u'\uxxxx'的unicode编码
140+
参考项目:[Python多进程抓取](https://github.com/lining0806/Spider_Python)
141+
142+
### 7. 验证码识别
143+
对于网站有验证码的情况,我们有三种办法:
144+
145+
1. 使用代理,更新IP。
146+
2. 使用cookie登陆。
147+
3. 验证码识别。
148+
149+
使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。
150+
可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。如果不成功,可以再次更新验证码识别,直到成功为止。
151+
参考项目:[Captcha1](https://github.com/lining0806/Captcha1)
152+
153+
154+
## 分析
155+
抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。
156+
常见的分析工具有[正则表达式](http://deerchao.net/tutorials/regex/regex.htm)[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)[lxml](http://lxml.de/)等等。
157+
158+
## 存储
159+
分析出我们需要的内容之后,接下来就是存储了。
160+
我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。
161+
162+
## Scrapy
163+
Scrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。
164+
相关内容可以参考[基于Scrapy网络爬虫的搭建](http://www.lining0806.com/%E5%9F%BA%E4%BA%8Escrapy%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E7%9A%84%E6%90%AD%E5%BB%BA/)

0 commit comments

Comments
 (0)