原文地址:https://github.com/lining0806/PythonSpiderNoteshtml
Python学习网络爬虫主要分3个大的版块:抓取,分析,存储java
另外,比较经常使用的爬虫框架Scrapy,这里最后也详细介绍一下。python
首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫须要的基本概念和技巧:宁哥的小站-网络爬虫mysql
当咱们在浏览器中输入一个url后回车,后台会发生什么?好比说你输入fireling的数据空间,你就会看到宁哥的小站首页。git
简单来讲这段过程发生了如下四个步骤:github
网络爬虫要作的,简单来讲,就是实现浏览器的功能。经过指定url,直接返回给用户所须要的数据,而不须要一步步人工去操纵浏览器获取。正则表达式
抓取sql
这一步,你要明确要获得的内容是是什么?是HTML源码,仍是Json格式的字符串等。mongodb
1. 最基本的抓取数据库
抓取大多数状况属于get请求,即直接从对方服务器上获取数据。
首先,Python中自带urllib及urllib2这两个模块,基本上能知足通常的页面抓取。另外,requests也是很是有用的包,与此相似的,还有httplib2等等。
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
此外,对于带有查询字段的url,get请求通常会未来请求的数据附在url以后,以?分割url和传输数据,多个参数用&链接。
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
相关参考:网易新闻排行榜抓取回顾
2. 对于登录状况的处理
2.1 使用表单登录
这种状况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 使用cookie登录
使用cookie登录,服务器会认为你是一个已登录的用户,因此就会返回给你一个已登录的内容。所以,须要验证码的状况可使用带验证码登录的cookie解决。
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,作法应该以下:
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登录
response2 = requests_session.get(url_login) # 已登录,由于以前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登录,由于以前拿到了Response Cookie!
相关参考:网络爬虫-验证码登录
3. 对于反爬虫机制的处理
3.1 使用代理
适用状况:限制IP地址状况,也可解决因为“频繁点击”而须要输入验证码登录的状况。
这种状况最好的办法就是维护一个代理IP池,网上有不少免费的代理IP,参差不齐,能够经过筛选找到能用的。对于“频繁点击”的状况,咱们还能够经过限制爬虫访问网站的频率来避免被网站禁掉。
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 时间设置
适用状况:限制频率状况。
Requests,Urllib2均可以使用time库的sleep()函数:
import time
time.sleep(1)
3.3 假装成浏览器,或者反“反盗链”
有些网站会检查你是否是真的浏览器访问,仍是机器自动访问的。这种状况,加上User-Agent,代表你是浏览器访问便可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,通常再加上Referer。
headers = {'User-Agent':'XXXXX'} # 假装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
4. 对于断线重连
很少说。
def multi_session(session, *arg):
while True:
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
或者
def multi_open(opener, *arg):
while True:
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
这样咱们就可使用multi_session或multi_open对爬虫抓取的session或opener进行保持。
5. 多进程抓取
这里针对华尔街见闻进行并行抓取的实验对比:Python多进程抓取 与 Java单线程和多线程抓取
相关参考:关于Python和Java的多进程多线程计算方法对比
6. 对于Ajax请求的处理
对于“加载更多”状况,使用Ajax来传输不少数据。
它的工做原理是:从网页的url加载网页的源代码以后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为何若是你直接去爬网页自己的url,你会找不到页面的实际内容。
这里,若使用Google Chrome分析”请求“对应的连接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET连接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。
7. 自动化测试工具Selenium
Selenium是一款自动化测试工具。它能实现操纵浏览器,包括字符填充、鼠标点击、获取元素、页面切换等一系列操做。总之,凡是浏览器能作的事,Selenium都可以作到。
这里列出在给定城市列表后,使用selenium来动态抓取去哪儿网的票价信息的代码。
参考项目:网络爬虫之Selenium使用代理登录:爬取去哪儿网站
8. 验证码识别
对于网站有验证码的状况,咱们有三种办法:
使用代理和使用cookie登录以前已经讲过,下面讲一下验证码识别。
能够利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登录。若是不成功,能够再次更新验证码识别,直到成功为止。
参考项目:Captcha1
爬取有两个须要注意的问题:
分析
抓取以后就是对抓取的内容进行分析,你须要什么内容,就从中提炼出相关的内容来。
常见的分析工具备正则表达式,BeautifulSoup,lxml等等。
存储
分析出咱们须要的内容以后,接下来就是存储了。
咱们能够选择存入文本文件,也能够选择存入MySQL或MongoDB数据库等。
存储有两个须要注意的问题:
Scrapy
Scrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用很是普遍。
相关内容能够参考基于Scrapy网络爬虫的搭建,同时给出这篇文章介绍的微信搜索爬取的项目代码,给你们做为学习参考。