1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python学习笔记之网络爬虫

Python学习笔记之网络爬虫

时间:2024-05-29 21:10:26

相关推荐

Python学习笔记之网络爬虫

网络爬虫

URL格式

protocol(协议)😕/hostname:port/path(文件路径)/[;parameters][?query]#fragment

urllib包

由urllib 和urllib2 合成,包含urllib.request、urllib.error、urllib.parse和urllib.robotparser 四个模块。

Python访问互联网

编码检测

在日常使用中,我们难以避免会遇到编码转换问题。

而进行编码转换的前提是你知道这个字符串使用的是什么编码。

比如你使用 urllib.request.urlopen() 获取一个网页时,你特么如果不知道网页的编码会怎样?

直接 read().decode() 就可能会出现下边错误:

这是因为无论是 encode() 还是 decode(),默认采取的编码/解码都是 encoding=“utf-8” 编码……

虽然你大 UTF-8 行迹踏遍天下,但在这神州大地,处处都有奇葩的好不?

这时候需要一个可靠的方式来检测字符串到底是什么编码,这样我们才能对症下药!

这里小甲鱼向大家推荐一个不错的模块:chardet,使用它就可以检测字符串的编码。

chardet 模块可以检测以下编码:

ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)

Big5, GB2312, EUC-TW, HZ-GB-2312, ISO--CN (Traditional and Simplified Chinese)

EUC-JP, SHIFT_JIS, CP932, ISO--JP (Japanese)

EUC-KR, ISO--KR (Korean)

KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)

ISO-8859-2, windows-1250 (Hungarian)

ISO-8859-5, windows-1251 (Bulgarian)

windows-1252 (English)

ISO-8859-7, windows-1253 (Greek)

ISO-8859-8, windows-1255 (Visual and Logical Hebrew)

TIS-620 (Thai)

chardet 模块安装方法:

(推荐)使用 pip 安装,打开命令行窗口(Windows 的 cmd,Linux 的 terminal,Mac 的“终端”)

输入命令:pip install chardet

chardet 模块用法:

非常简单,使用该模块的 detect() 函数即可:

>>> import urllib.request>>> response = urllib.request.urlopen("").read()>>> import chardet>>> chardet.detect(response){'confidence': 0.99, 'encoding': 'GB2312'}

哦,confidence 是可信度的意思……

0.99 就是 99% 确定是 ‘GB2312’!

年轻人,你太傲娇了,偶其实使用的是 GBK 编码(GBK 是 GB2312 的扩展)

所以你直接 decode(‘GB2312’) 还是会报错的:

>>> response.decode("GB2312")Traceback (most recent call last):File "<pyshell#41>", line 1, in <module>response.decode("GB2312")UnicodeDecodeError: 'gb2312' codec can't decode byte 0xfd in position 22581: illegal multibyte sequence

你现在有两种选择:

一、忽略识别不出的字符(GB2312 支持的汉字比较少,如果用这种方法会出现小部分乱码)

>>> response.decode("GB2312", "ignore")……<ul><li># <a href="thread-64400-1-1.html" title="乔布斯最精彩演讲:这三个故事决定了我的一生" target="_blank">乔布斯最精彩演讲:这三个故事决定了我的一</a></li><li># <a href="thread-50608-1-1.html" title="42个锻炼大脑的方法,你想不聪明都不行!" target="_blank">42个锻炼大脑的方法,你想不聪明都不行!</a></li><li># <a href="thread-23917-1-1.html" title="潘靠赐辏泪流满面(转)" target="_blank">潘靠赐辏泪流满面(转)</a>……

二、(推荐)由于 GBK 是向下兼容 GB2312,因此你检测到是 GB2312,则直接用 GBK 来编码/解码

>>> if chardet.detect(response)['encoding'] == 'GB2312':response.decode('GBK')……<ul><li># <a href="thread-64400-1-1.html" title="乔布斯最精彩演讲:这三个故事决定了我的一生" target="_blank">乔布斯最精彩演讲:这三个故事决定了我的一</a></li><li># <a href="thread-50608-1-1.html" title="42个锻炼大脑的方法,你想不聪明都不行!" target="_blank">42个锻炼大脑的方法,你想不聪明都不行!</a></li><li># <a href="thread-23917-1-1.html" title="屌丝看完,泪流满面(转)" target="_blank">屌丝看完,泪流满面(转)……

urllib.request.urlopen()

import urllib.request as urresponse = ur.urlopen('/g/500/600')

相当于

import urllib.request as urreq = ur.Request('/g/500/600')response = ur.urlopen(req)

urllib.request.urlopen()不但可以装URL还可以装其对象,其返回是一个对象,即文件对象 ,它除了用read()方法还可以使用geturl()、ingo()、getcode()

爬取有道翻译实例

import urllib.request as urimport urllib.parse as upimport jsoncontent = input("请输入需要翻译的内容:")url = '/translate?smartresult=dict&smartresult=rule'data = {}data['i'] = contentdata['from'] = 'AUTO'data['to'] = 'AUTO'data['smartresult'] = 'dict'data['client'] = 'fanyideskweb'data['salt'] = '16117273951262'data['sign'] = '058a0edca2f5d629c7c5287c991b17dc'data['lts'] = '1611727395126'data['bv'] = 'b396e111b686137a6ec711ea651ad37c'data['doctype'] = 'json'data['version'] = '2.1'data['keyfrom'] = 'fanyi.web'data['action'] = 'FY_BY_REALTlME'data = up.urlencode(data).encode('utf-8')response = ur.urlopen(url, data)html = response.read().decode('utf-8')target = json.loads(html)print("翻译结果:%s"%(target["translateResult"][0][0]['tgt']))

请输入需要翻译的内容:我是你爹翻译结果:I am your father>>>

隐藏

由于网站会检查链接的来源,当网站检查出异常就会掐掉,所以我们需要隐藏,一般服务器都是检查链接里headers的Use-Agent,通过修改headers的Use-Agent使链接看起来像是正常访问

修改headers

1.通过Request的headers参数修改

import urllib.request as urimport urllib.parse as upimport jsoncontent = input("请输入需要翻译的内容:")url = '/translate?smartresult=dict&smartresult=rule'head = {}head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'data = {}data['i'] = contentdata['from'] = 'AUTO'data['to'] = 'AUTO'data['smartresult'] = 'dict'data['client'] = 'fanyideskweb'data['salt'] = '16117273951262'data['sign'] = '058a0edca2f5d629c7c5287c991b17dc'data['lts'] = '1611727395126'data['bv'] = 'b396e111b686137a6ec711ea651ad37c'data['doctype'] = 'json'data['version'] = '2.1'data['keyfrom'] = 'fanyi.web'data['action'] = 'FY_BY_REALTlME'data = up.urlencode(data).encode('utf-8')req = ur.Request(url, data, head)response = ur.urlopen(req)html = response.read().decode('utf-8')target = json.loads(html)print("翻译结果:%s"%(target["translateResult"][0][0]['tgt']))

2.通过Request.add_header()方法修改

3.延时,通过停止系统一段时间来合理访问。

4.代理,利用多个ip地址进行访问

①参数是一个字典{’类型‘:’代理ip:端口号‘}

proxy_support = urllib.request.ProxyHandler({})

②定制、创建一个opener

opener = urllib.request.build_opener(proxy_support)

③a 安装opener(将其安装到系统以后就可以直接调用)

③b 调用opener

opener.open(url)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。