Python入门网络爬虫之精华版

Python学习网络爬虫主要分3个大的版块:抓取,分析,存储

另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下。

首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫

当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入http://www.lining0806.com/,你就会看到宁哥的小站首页。

简单来说这段过程发生了以下四个步骤:

查找域名对应的IP地址。

向IP对应的服务器发送请求。

服务器响应请求,发回网页内容。

浏览器解析网页内容。

网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。

抓取

这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。

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):

retryTimes = 20

while retryTimes>0:

try:

return session.post(*arg)

except:

print '.',

retryTimes -= 1

或者

def multi_open(opener, *arg):

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),循环过程。

如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。

对返回的json格式数据(str)进行正则匹配。json格式数据中,需从’\uxxxx’形式的unicode_escape编码转换成u’\uxxxx’的unicode编码。

7. 自动化测试工具Selenium

Selenium是一款自动化测试工具。它能实现操纵浏览器,包括字符填充、鼠标点击、获取元素、页面切换等一系列操作。总之,凡是浏览器能做的事,Selenium都能够做到。

这里列出在给定城市列表后,使用selenium来动态抓取去哪儿网的票价信息的代码。

参考项目:网络爬虫之Selenium使用代理登陆:爬取去哪儿网站

8. 验证码识别

对于网站有验证码的情况,我们有三种办法:

使用代理,更新IP。

使用cookie登陆。

验证码识别。

使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。

可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。当然也可以将验证码图片上传到打码平台上进行识别。如果不成功,可以再次更新验证码识别,直到成功为止。

参考项目:验证码识别项目第一版:Captcha1

爬取有两个需要注意的问题:

如何监控一系列网站的更新情况,也就是说,如何进行增量式爬取?

对于海量数据,如何实现分布式爬取?

分析

抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。

常见的分析工具有正则表达式,BeautifulSoup,lxml等等。

存储

分析出我们需要的内容之后,接下来就是存储了。

我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。

存储有两个需要注意的问题:

如何进行网页去重?

内容以什么形式存储?

Scrapy

Scrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。

相关内容可以参考基于Scrapy网络爬虫的搭建,同时给出这篇文章介绍的微信搜索爬取的项目代码,给大家作为学习参考。

参考项目:使用Scrapy或Requests递归抓取微信搜索结果

楚江数据是一家专业的互联网数据技术服务商,我们为客户提供网站APP数据采集和爬虫软件微博爬虫定制开发服务,服务范围涵盖社交网络、电子商务、分类信息、学术研究等,我们的服务和产品已经获得数千家客户的好评。

官方网站http://www.chujiangdata.com

转载请注明:宁哥的小站 » Python入门网络爬虫之精华版

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫当我们在浏览器中输...
    Python程序媛阅读 280评论 0 0
  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 17,987评论 45 523
  • 一、网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spide...
    随风化作雨阅读 1,028评论 0 0
  • 目录: Python网络爬虫(一)- 入门基础[https://www.jianshu.com/p/9dfbe35...
    一只写程序的猿阅读 6,435评论 0 22
  • 文/居里社 假如生命只剩下两个月的光阴 一眼望到头 是该恐慌,还是该泪流 左脸写下不舍,右颊填上离殇 从哪里来 又...
    居里叶阅读 216评论 0 2