11# Python入门网络爬虫之精华版
22
3- Python学习网络爬虫主要分3个大的版块:** 抓取** ,** 分析** ,** 存储**
4- 另外,比较常用的爬虫框架[ Scrapy] ( http://scrapy.org/ ) ,这里最后也介绍一下。
3+ Python学习网络爬虫主要分3个大的版块:** 抓取** ,** 分析** ,** 存储**
4+ 另外,比较常用的爬虫框架[ Scrapy] ( http://scrapy.org/ ) ,这里最后也介绍一下。
55先列举一下相关参考:[ 宁哥的小站-网络爬虫] ( http://www.lining0806.com/category/spider/ )
66***
77
88## 抓取
99这一步,你要明确要得到的内容是是什么?是HTML源码,还是Json格式的字符串等等。
1010
1111#### 1. 最基本的抓取
12- 一般属于get请求情况,直接从服务器上获取数据。
12+ 一般属于get请求情况,直接从服务器上获取数据。
1313首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,[ requests] ( https://github.com/kennethreitz/requests ) 也是非常有用的包,与此类似的,还有[ httplib2] ( https://github.com/jcgregorio/httplib2 ) 等等。
1414```
1515Requests:
@@ -31,7 +31,7 @@ Httplib2:
3131 print "response headers:", response_headers # dict
3232 print "content:", content
3333```
34- 此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。
34+ 此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。
3535```
3636data = {'data1':'XXXXX', 'data2':'XXXXX'} # dict类型
3737Requests:data为dict,json
@@ -46,7 +46,7 @@ Urllib2:data为string
4646
4747### 2. 对于反爬虫机制的处理
4848** 2.1 模拟登陆情况 **
49- 这种属于post请求情况,先向服务器发送表单数据,服务器再将返回的cookie存入本地
49+ 这种属于post请求情况,先向服务器发送表单数据,服务器再将返回的cookie存入本地。
5050```
5151data = {'data1':'XXXXX', 'data2':'XXXXX'} # dict类型
5252Requests:data为dict,json
@@ -59,7 +59,7 @@ Urllib2:data为string
5959 response = urllib2.urlopen(req)
6060```
6161** 2.2 使用cookie登陆情况 **
62- 使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。
62+ 使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。
6363```
6464import requests
6565requests_session = requests.session() # 创建会话对象requests.session(),可以记录cookie
@@ -88,7 +88,7 @@ Urllib2:
8888```
8989
9090### 3. 使用代理
91- 适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。
91+ 适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。
9292```
9393proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
9494Requests:
@@ -126,17 +126,17 @@ def multi_open(opener, *arg):
126126 print '.',
127127 retryTimes -= 1
128128```
129- 这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。
129+ 这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。
130130
131131### 5. 多进程抓取
132132这里针对[ 华尔街见闻] ( http://live.wallstreetcn.com/ ) 进行多进程的实验对比:[ Python多进程抓取] ( https://github.com/lining0806/Spider_Python ) 与 [ Java多进程抓取] ( https://github.com/lining0806/Spider )
133133相关参考:[ 关于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/ )
134134
135135### 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编码
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编码。
140140参考项目:[ Python多进程抓取] ( https://github.com/lining0806/Spider_Python )
141141
142142### 7. 验证码识别
@@ -146,19 +146,19 @@ def multi_open(opener, *arg):
1461462 . 使用cookie登陆。
1471473 . 验证码识别。
148148
149- 使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。
150- 可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。如果不成功,可以再次更新验证码识别,直到成功为止。
149+ 使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。
150+ 可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。如果不成功,可以再次更新验证码识别,直到成功为止。
151151参考项目:[ Captcha1] ( https://github.com/lining0806/Captcha1 )
152152
153153
154154## 分析
155- 抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。
156- 常见的分析工具有[ 正则表达式] ( http://deerchao.net/tutorials/regex/regex.htm ) ,[ BeautifulSoup] ( http://www.crummy.com/software/BeautifulSoup/ ) ,[ lxml] ( http://lxml.de/ ) 等等。
155+ 抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。
156+ 常见的分析工具有[ 正则表达式] ( http://deerchao.net/tutorials/regex/regex.htm ) ,[ BeautifulSoup] ( http://www.crummy.com/software/BeautifulSoup/ ) ,[ lxml] ( http://lxml.de/ ) 等等。
157157
158158## 存储
159- 分析出我们需要的内容之后,接下来就是存储了。
160- 我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。
159+ 分析出我们需要的内容之后,接下来就是存储了。
160+ 我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。
161161
162162## 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/ )
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