python urllib3 爬虫3爬虫urllib.request.urlopen("网址").read() 本来是utf-8,为什么还要加上urlencode(“utf-8”)

没有更多推荐了,
知乎专栏:
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Python3&修改抓取必应背景图代码
周末心血来潮,重拾很久之前就想学的Python,就装了Python2.7和Python3.4,由于以前用过绿色版的eclispe,印象比较好,所以IDE(集成开发环境)就选了eclispe+Pydev。
学Python主要是为了爬虫,听说可以抓取网上各种资源,能不花什么力气就能满足收藏癖,所以刚装好就用Python2.7
复制网上&的代码。一下子就成功,表示很开心。
不过看了知乎上关于&的问答后,最终选择Python3.4学习,于是出于练习的心态,修改了这段代码,并把遇到的问题记录一下,没准能帮到其他人。
步骤如下:
首先复制&&里最终的代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# -*- author:insun -*-
# python2抓取bing主页所有背景图片
urllibresysos
get_bing_backphoto
if ospathexists'photos'
osmkdir'photos'
range01000
'http://cn.bing.com/HPImageArchive.aspx?format=js&idx='stri
&&&&&&&&&&&&&&
'&n=1&nc=7&FORM=HYLH1'
urlliburlopenurlread
&&&&&&&&&&&
'open & read bing error!'
&&&&&&&&&&&
recompile'"url":"(.*?)","urlbase"'reS
refindallreghtml
#http://s.cn.bing.net/az/hprichbg/rb/LongJi_ZH-CN_.jpg
&&&&&&&&&&&
imgurlrindex'/'
&&&&&&&&&&&
imgurlreplaceimgurlright1''
&&&&&&&&&&&
&&&&&&&&&&&
urlliburlretrieveimgurl
&&&&&&&&&&&
' save success!'
get_bing_backphoto
用Python3.4运行后,提示如下
& & “AttributeError:
'module' object has no attribute 'urlopen'”
原因是Python3里的urllib模块已经发生改变,此处的urllib都应该改成urllib.request。
修改之后再运行,发现又有如下提示:
& & TypeError: can't use a
string pattern on a bytes-like object
原因为Python3 findall数据类型用bytes类型,因此在正则表达式前应添加html =
html.decode('utf-8')。
修改完后运行,成功~,不过由于网站原因,仍只能保存最近的24张背景图。最终代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# -*- author:arron ni-*-
# python3抓取bing主页所有背景图片
urllibresysos
get_bing_backphoto
if ospathexists'photos'
osmkdir'photos'
'http://cn.bing.com/HPImageArchive.aspx?format=js&idx='stri'&n=1&nc=7&FORM=HYLH1'
urllibrequesturlopenurlread
&&&&&&&&&&print
'open & read bing error!'
&&&&&&&&&&&
htmldecode'utf-8'
recompile'"url":"(.*?)","urlbase"'reS
refindallreghtml
#http://s.cn.bing.net/az/hprichbg/rb/LongJi_ZH-CN_.jpg
&&&&&&&&&&&
imgurlrindex'/'
&&&&&&&&&&&
imgurlreplaceimgurlright1''
&&&&&&&&&&&
&&&&&&&&&&&
urllibrequesturlretrieveimgurl
&&&&&&&&&&&
print name
' save success!'
get_bing_backphoto
由于bing图片对外接口的图片json格式变了,python第三方库的导入格式有变化,因此代码调整如下:
#!/usr/bin/env
# -*- coding:utf-8
# -*- author:arron
# python3抓取bing主页所有背景图片
import urllibrequestresysos
def get_bing_backphoto
if ospathexists'photos'
osmkdir'photos'
in range010
'http://cn.bing.com/HPImageArchive.aspx?format=js&idx='stri'&n=1&nc=7&FORM=HYLH1'
urllibrequesturlopenurlread
&&&&&&&&&&&
print 'open & read bing
&&&&&&&&&&&
htmldecode'utf-8'
htmlreplace'/az/''http://s.cn.bing.net/az/'
recompile'"url":"(.*?)","urlbase"'reS
refindallreghtml
#http://s.cn.bing.net/az/hprichbg/rb/LongJi_ZH-CN_.jpg
for imgurl in text
&&&&&&&&&&&
imgurlrindex'/'
&&&&&&&&&&&
printimgurl
&&&&&&&name
imgurlreplaceimgurlright1''
&&&&&&&&&&&
&&&&&&&&&&&
urllibrequesturlretrieveimgurl savepath
&&&&&&&&&&&
print name
get_bing_backphoto
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!09:15 提问
关于python3.x 编写爬虫的报错问题
找了好几天的资料还是没能解决,拜托各位!
import urllib.error
urllib.request
import urllib.parse
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.baidu.com/link HTTP/1.1'
data['type']= 'AUTO'
data['i'] = 'I am fine !'
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'
head['User-Agent']= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/ Firefox/52.0'
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url,data,head)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
except urllib.error.HTTPError as e:
print ('Error code : ',e.code)
except urllib.error.URLError as e:
print ('The reason: ',e.reason)
抛出异常:
按赞数排序
400 请求出错 由于语法格式有误,服务器无法理解此请求。
你提交的客户端请求数据有问题,不符合格式,你可以用浏览器抓包对比一下,看有什么数据不对
如果在windows系统可能是window防火墙的问题,关掉相关规则或者关掉防火墙可能解决问题
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐从几只爬虫开始(持续更新) - 简书
从几只爬虫开始(持续更新)
人生苦短,我用Python。
更新记录:
第一段代码错误更正,感谢@的提醒~~
req = urllib.request.urlopen(')
在改代码的时候上面这一段中的urlopen是应该改为Request的。
简单地图片下载爬虫
废话不多说,来看第一个例程。
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 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。——源自
通过爬虫实现在线翻译
在有了以上基础以后,开始摸索更为复杂的爬虫。第二个例程要实现通过爬虫使用有道词典的在线翻译。
还是先上源码:
#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['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.parse和json。先不管这些,让我们先来分析一下如何实现使用有道词典的在线翻译。
打开Chrome进入有道翻译的页面,我们先简单看一下翻译“i love you”时,浏览器与服务器之间的交互,顺便了解我们的代码。
进入“审查元素”页面,我们在输入完“i love you”之后点击翻译,看到“Network”下一大堆浏览器与服务器之间的交互。
我们点击进入第一个浏览器向服务器提交的POST请求,来分析下想要用代码模拟人的操作,需要些什么。
如上图所示,我们要代码实现交互,就要模拟浏览器,向服务器提交POST。那么如何完成呢,就要接住urlopen这个函数了。查看API文档,我们找到urlopen这个函数,看看他到底是如何使用的:
urlopen函数在定义时可以传两个参数分别为url和data。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
呐,知道了这些,我们就来实践一下,使用代理来访问一个宝岛台湾的网站,这是一个很有意思的玩意儿,这个网站只有一个作用那就是显示你当前访问它使用的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 (M Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0. 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。
(未完待续……)
非典型性程序员
1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、数据可视化等各大部分。在此作为初出茅庐的数据小白,我将会把自己学习数据科学过程中遇到的一些问题记录下来,以便后续的查阅,同时也希望与各路同学一起交流、一起进步。...
抓取网页1)直接抓取网页法 注意导入模块一定要写成urllib.request,urllib.parse等等。urllib2模块在Python3已拆分更名为urllib.request和urllib.error。写成import urllib会出错:'module' obj...
Python 函数式编程入门教程 - 后端 - 掘金本文为作者原创,转载请先与作者联系。同发于博客园和 SegmentFault专栏 Functional Programming 引言 Functional Programming(函数式编程)的概念最早起源于LISP,由约...
Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下。 首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫 当我们在浏览器中输入一个url后回车,后台会发生什...
这几天不知是台风要来的原故,从末感觉天气热,也不会大汗淋淋的我,汗如泉湧,不小心 鼻涕流,感冒头晕浑身非常的不舒服。晚上用自己学到的中医知识和手法调理自己,一定是 贪凉脾胃受凉,用红外灯考脐,用外用药泡脚,坚持不服用药,二天的时间,身体恢复正常,感恩自己的 五脏六腑机能全,...
健身搞肌的读者里有学生也有白领,经常会遇到学习、工作任务突然加大,没时间锻炼的情况,迫于生活压力只能选择放弃健身,担心停止训练之后,原来辛辛苦苦付出得到的那些肌肉,就如同过眼云烟一般一去不复返。 的确在你停训后,你的身体慢慢就会失去训练痕迹,直到一天变成路人模样,但是,健身...
熬过了冬,迎来了春。在这万物复苏的季节,阳光和煦,春风微醺,花开鸟鸣,甚是和谐。 花开的季节,身边处处都是美丽的风景,以下图片摄于宁波植物园以及自家楼下 大片的油菜花,一种静谧的美 樱花,一直是心头爱,那年那时,和心爱的他一起奔赴绍兴看一场樱花雨 郁金香,是一种浓郁的美 自...
今天是输出的第11天,还没找到输出的原动力!有点不想坚持了,可又不想被淘汰,努力吧,不要让今天你,讨厌明天的自己!
许是春愁不可替 一阙新词且相记 千金,白壁歌,风云去 有客居于桃花驿 风雨里栖未肯离 秣陵人老于花期 不过,看戏 哪管人梅柳意 不过,看戏 哪管人断肠笛 戏言,无果 那相看俨然何致不能契阔 拍板去,道深情不可欺 暗红尘霎时雪亮 热春光一阵冰凉 戏...

我要回帖

更多关于 python3 request 爬虫 的文章

 

随机推荐