从几只爬虫开始(持续更新)


人生苦短,我用Python。

Why every programmer should learn Python or Ruby

更新记录:

--2015.10.12--
第一段代码错误更正,感谢@Aldrin的提醒~~
req = urllib.request.urlopen('http://placekitten.com/g/500/600')
在改代码的时候上面这一段中的urlopen是应该改为Request的。

--2015.10.12--
使用代理


简单地图片下载爬虫

废话不多说,来看第一个例程。

import urllib.request

req = urllib.request.Request('http://placekitten.com/g/500/600')
response = urllib.request.urlopen(req)

cat_img = response.read()

with open('cat_500_600.jpg','wb') as f:
    f.write(cat_img)

这是最初级的一个实例,上面这个爬虫从这个猫奴网站下载了一可爱的小猫。这算是最简单的一个python爬虫了,只用到了一个urlopen方法。

通过上面的例程搞懂以下几个问题:

  • urllib模块有什么作用
  • urlopen函数的使用
  • 文件的open操作
  • with语句的用法

查阅一番资料和Python的API文档,可以得到以下答案:

  • urllib模块是Python的一个获取url(Uniform Resource Locators,统一资源定址器)的模块。

  • urlopen函数提供了一个非常简洁的接口,使得Python用各种各样的协议获取url。对请求的url返回一个response对象。这个response是一个file-like的对象,能用.read()函数操作这个response对象。

  • fp = open("文件名",打开模式)直接打开一个文件,如果文件不存在则创建文件

图一
图一
  • with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能,从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍)。with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。——源自《浅谈 Python 的 with 语句》

通过爬虫实现在线翻译

在有了以上基础以后,开始摸索更为复杂的爬虫。第二个例程要实现通过爬虫使用有道词典的在线翻译。

还是先上源码:

#coding: utf-8
import urllib.request
import urllib.parse
import json

content = input("what do you want to translate?")
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null'
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'

data = urllib.parse.urlencode(data).encode('utf-8')

response = urllib.request.urlopen(url, data)
html = response.read().decode('utf-8')

json.loads(html)
target = json.loads(html)
print("result:%s"% (target['translateResult'][0][0]['tgt']))

比第一个复杂了好多。不着急,一行一行看。

相比于第一个例程里只有urllib.request模块,这次我们多导入了两个模块urllib.parsejson。先不管这些,让我们先来分析一下如何实现使用有道词典的在线翻译。

打开Chrome进入有道翻译的页面,我们先简单看一下翻译“i love you”时,浏览器与服务器之间的交互,顺便了解我们的代码。

进入“审查元素”页面,我们在输入完“i love you”之后点击翻译,看到“Network”下一大堆浏览器与服务器之间的交互。

图二
图二

我们点击进入第一个浏览器向服务器提交的POST请求,来分析下想要用代码模拟人的操作,需要些什么。

图三
图三

图四
图四

如上图所示,我们要代码实现交互,就要模拟浏览器,向服务器提交POST。那么如何完成呢,就要接住urlopen这个函数了。查看API文档,我们找到urlopen这个函数,看看他到底是如何使用的:

图五
图五

urlopen函数在定义时可以传两个参数分别为urldata。url为我们实际需要访问的链接,这里要特别注意,url参数的值必须为图三中的Request URL梭织链接,而并非浏览器地址栏中的url。而data参数为字典类型,内容就是我们要向服务器提交的POST内容,也就是图四中From Data的内容了,于是我们在代码(第6~16行)中直接定义即可。

这里还有一点需要注意,在代码的第18行,有关字符编码。我们的POST要以字符串编码的形式提交,而我们定义的却是字典类型的数据,这时候就要借助urllib.parse模块中的urlencode()函数来实现转义。格式为“utf-8”(.encode('utf-8'))。

图六
图六

好了。在爬取网页之前的准备工作就已经全部完成了,接下来我们进行爬取并打印response对象的内容:

图七
图七

没有错,我们获得了json格式的内容,那什么是json,json模块中有哪些函数,它们又如何使用?


图八
图八

接下来就是从json数据中提取出我们想要的内容了。使用json.loads()提取出字典后,打印就好了。

图九
图九

最后来测试下整体的效果:

图十
图十

使用代理

当我们用python爬虫进行一些比较密集的爬取(比如下载某网站的所有图片啊)时,服务器会对我们进行封锁,那么我们要如何继续疯狂的爬啊爬呢?

没有错,就是使用代理。我们用很多个不同的ip地址去登陆服务器,这样服务器就会误认为是很多个不同的人在链接,所以就不会封锁你咯。再搭配上面提到的对Headers的设置,我们就可以快速的进行爬取了。

在Python中使用代理一共有如下几步:

  • 设置一个字典作为参数,要这样的格式:{‘类型’:‘代理ip:端口号’}
  • 调用urllib.request.ProxyHandler()方法,传入我们刚刚设置的字典参数
  • 定制、创建我们的opener,用来获取url
  • 安装我们“私人定制”的opener
  • 调用opener

呐,知道了这些,我们就来实践一下,使用代理来访问一个宝岛台湾的网站whatismyip,这是一个很有意思的玩意儿,这个网站只有一个作用那就是显示你当前访问它使用的IP地址。

好,先来看看代码:

#coding: utf-8
import urllib.request
import urllib.parse
import random

url = 'http://www.whatismyip.com.tw'

iplist = ['222.88.236.236:843','125.131.193.43:80','183.252.18.131:8080']


proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})

opener = urllib.request.build_opener(proxy_support)


opener.addheaders = [('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36')]
urllib.request.install_opener(opener)

response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')

print(html)

我们还是一句一句的来分析,首先是我们要访问的域名,不多说。往下走,我们新建一个列表,来储存待用的ip地址。至于代理ip的话,网上有好多,百度一下,copy过来。

接下来我们定义了一个proxy_support,后面用的是urllib.request.ProxyHandler()方法,从这一句开始,我们开始使用代理。然后我们自定义了一个opener,并且安装了它

还是从文档开始看起:

图十一
图十一

图十二
图十二

功能就是大概我们描述的样子。接下来的的大家都已经熟悉了,最后我们打印获得的网页HTML源码,来看我们到底用了什么ip地址去访问:

图十三
图十三

再运行一次,看看,两次的访问ip可是不一样的咧。

图十四
图十四

需要注意的一点是,这些代理ip可是每天都在变得,如果如果你想运行参考例程,最好是重新搜一下代理ip并更新代码中的iplist。


(未完待续……)

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

推荐阅读更多精彩内容

  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 18,067评论 45 523
  • Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细...
    楚江数据阅读 1,469评论 0 6
  • 这几天不知是台风要来的原故,从末感觉天气热,也不会大汗淋淋的我,汗如泉湧,不小心 鼻涕流,感冒头晕浑身非常的不舒服...
    童希园阅读 175评论 0 0
  • 熬过了冬,迎来了春。在这万物复苏的季节,阳光和煦,春风微醺,花开鸟鸣,甚是和谐。 花开的季节,身边处处都是美丽的风...
    许芷桉阅读 402评论 0 2
  • 今天是输出的第11天,还没找到输出的原动力!有点不想坚持了,可又不想被淘汰,努力吧,不要让今天你,讨厌明天的自己!
    高倩阅读 178评论 0 0