第五十四课:论一只爬虫的自我修养:实战

内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归小甲鱼官方所有。

练习题(来自小甲鱼官方论坛)

0.请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

  • 第一个例子是做一个最简单的爬虫
    我们去网站上下载一张图片。
import urllib.request

response = urllib.request.urlopen("http://placekitten.com/g/200/300")
cat_img = response.read()
with open('cat_200_300.jpg', 'wb') as f:
    f.write(cat_img)

req = urllib.request.Request("http://placekitten.com/g/200/400")
response2 = urllib.request.urlopen(req)
cat_img2 = response2.read()
with open('cat_200_400.jpg', 'wb') as f:
    f.write(cat_img2)

两张方法皆可。首先,urlopen的url参数既可以是一个字符串也可以是Request对象,如果你传入一个字符串,那么Python是会默认先帮你把目标字符串转换成Request对象,然后再传给urlopen函数。
然后,urlopen实际上返回的是一个类文件对象,因此你可以用read()方法来读取内容。除此之外,文档还告诉你有三个函数可能以后会用到:
1️⃣geturl():返回请求的url
2️⃣info():返回一个httplib.HTTPMessage对象,包含远程服务器返回的头信息
3️⃣getcode():返回HTTP状态码

import urllib.request

response = urllib.request.urlopen("http://placekitten.com/g/200/500")
print(response.geturl())
print(response.info())
print(response.getcode())

输出:

http://placekitten.com/g/200/500
Date: Tue, 28 Aug 2018 05:28:35 GMT
Content-Type: image/jpeg
Transfer-Encoding: chunked
Connection: close
Set-Cookie: __cfduid=d4759915be0d0d369ceb59fdfd4dcfcf71535434115; expires=Wed, 28-Aug-19 05:28:35 GMT; path=/; domain=.placekitten.com; HttpOnly
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=86400
Expires: Wed, 29 Aug 2018 05:28:35 GMT
CF-Cache-Status: HIT
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 45146018823196a0-FRA


200

  • 第二个例子是用有道来翻译文本。
    1️⃣首先打开官网http://fanyi.youdao.com
    有道翻译.png

    2️⃣F12(或alt + command + i),切换到Network窗口。
    Network.png

    3️⃣点击Method是POST的请求。
    Headers.png

    HTTP是基于请求-响应的模式的,客户端发出的请求叫Request,服务端的响应叫Response。
    Request Headers是客户端发送请求的Headers,这个常常被服务器用来判断是否来自“非人类”的访问。例如写个Python代码,然后利用这个代码批量访问网站的数据,这样副武器的压力就会增大,所以一般服务器不欢迎“非人类”的访问。
    一般是通过这个User-Agent来识别,普通浏览器会通过该内容向访问网站提供你所使用的浏览器类型、操作系统、浏览器内核等信息的标识:
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
    而使用Python访问的话,User-Agent会被定义为Python-urllib/3.4。
    但事实上,User-Agent可以自定义的。
    Form Data.png

    Form Data就是POST提交的内容。
    那么如何用Python提交POST表单呢?
    urlopen函数有一个data参数,如果给这个参数赋值,那么HTTP的请求就是使用POST方式;如果data=None,也就是默认值,那么HTTP的请求就是使用GET方式。
    urllib.request.urlopen()提交数据.png

    这里还告诉我们,这个data参数的值必须符合这个application/x-www-form-urlencoded的格式,然后要用urllib.parse.urlencode()将字符串转换为这个格式。
import urllib.request
import urllib.parse

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=http://www.youdao.com"
data = {}
data['type'] = 'AUTO'

data['i'] = 'I love FishC.com!'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url, data)
html = response.read().decode('utf-8')
print(html)

输出:

{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"I love FishC.com!","tgt":"我爱FishC.com !"}]]}

字符串在Python3内部的表示是Unicode编码,因此,在做编码转换时,通常需要以Unicode作为中间编码,即先将返回的bytes对象的数据解码(decode)成Unicode,再从Unicode编码(encode)成另一种编码。
有关编码的问题可以参考https://fishc.com.cn/thread-56452-1-1.html
接下来是解析上面这个JSON格式的字符串:

import urllib.request
import urllib.parse
import json

content = input("请输入需要翻译的内容:")
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=http://www.youdao.com"
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')  # 转换格式并编码为utf-8
response = urllib.request.urlopen(url, data)  # post请求必须带上data参数
html = response.read().decode('utf-8')
target = json.loads(html)
print("翻译结果:%s" % (target['translateResult'][0][0]['tgt']))  # 一层一层剥掉

输出:

请输入需要翻译的内容:I want to go home.
翻译结果:我想回家了。


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

推荐阅读更多精彩内容

  • urllib and urllib2 区别 –博主提示:下面的是python2中的用法,python3需要做出相应...
    sunnyRube阅读 1,403评论 0 1
  • 我想任何美好的事物都不是轻松得来的,一定都在路上跑了好久,最终来到你面前,对你伸出双手,说一声不好意思让你久等了,...
    那年的流浪狗阅读 374评论 0 5
  • 文章的题目被我反复修改《孤独》,《话说孤独》,《寻找孤独》,《享受孤独》,因为读完此文,它围绕孤独来写的,一瞬间“...
    周肖阅读 288评论 0 0
  • ​牛奶制品是一个非常传统的产品,人为什么要喝牛奶,几乎已经跟人为什么要喝水一样家喻户晓人人知,照理根本不需要我们的...
    沈坤策划阅读 255评论 0 0
  • 最近自己也赶了回时髦,有点“水逆”!所谓“水逆”,百度解释水星逆行在占星术中经常被简称为“水逆“。 水逆影响着记忆...
    涂涂0907阅读 348评论 2 3