urllib库简介
urllib是python3.x中用于操作URL的一个模块(库),合并了python2.x中的urllib、urllib2库。快速爬取网页
import urllib.request as url_req
with url_req.urlopen(“http://www.baidu.com“) as file:
下面要读取网页内容
法一(一行一行读):
for line in file:
print(line)
法二(一次性全部读出来):
page = file.read()
print(page)
file有以下几种方法:
file.readline():执行一次读取一行
file.read():读取全部存入一个字符串
file.readlines():返回一个列表,列表的每一项为网页内容的每一行
需要注意的有以下两点:
1)file对象执行file.read()后文件指针就指向了最后,所以再次执行时返回的就是空串了,但是file对象又没有seek方法,所以只能重新执行urlopen(url)或者将page=file.read()赋值给一个变量以便于后续处理。
2)file.read()、file.readline()方法返回的字符串为b”…”二进制字符串,所以打印时会有一个b开头,且中文显示为十六进制,且即使print这个字符串,里面的转义字符还是不会被解析,解决方法可以为:print(file.read().decode(‘utf-8’))或者print(file.read().decode());再转化为二进制文件的方法为:print(file.read().decode().encode()),即转化方法如下:二进制.decode()—》普通字符串;普通字符串.encode()—》二进制。将爬取的网页以网页的形式保存到本地
思路一:
1)将爬取的网页内容read()出来赋值给一个变量page
2)以写入的方式打开一个本地文件,命名为*.html格式
3)将变量page的值写入到本地文件中,注意步骤1中读出的page是二进制,所以步骤二要以open(‘a.html’,’wb’)方式本地html文件,若是page转化为字符串格式,那么步骤二这里要对应起来open(‘a.html’,’w’)即可;
data = url_req.urlopen(‘http://edu.51cto.com‘).read()
with open(‘/Users/macxunlei/Desktop/python3/爬虫/edu_51cto.html’,’wb’) as f:
f.write(data)
找到路径下的edu_51cto.html用浏览器打开即可
注意:html里面中文没有乱码,但是用safari打开中文乱码,但是chrome浏览器打开就不会,是浏览器设置问题,safari浏览器–》偏好设置–》高级–》默认编码改为:Unicode(UTF-8)即可解决乱码问题。
思路二:直接利用urllib.request的urlretrieve方法,如下
urllib.request.urlretrieve(‘http://edu.51cto.com‘,filename=’/Users/macxunlei/Desktop/python3/爬虫/2.html’),这样在相应的目录下就下载好了本地2.html文件,此种方法会产生一些缓存,用urllib.request.urlcleanup()清除缓存urllib.request.urlopen()生成的文件对象的其他方法和属性
file = urllib.request.urlopen(‘http://www.jd.com‘)
1)查看当前环境有关信息:
file.info() —>> http.client.HTTPMessage at 0x1106340b8
2)获取当前爬取网页的状态码(200为响应成功):
file.getcode()
3)获取当前爬取的url地址:
file.geturl()python3中的urlopen对于中文url如何处理
比如http://dotamax.com/,看下源码的话,上方的搜索框的name=p,输入内容点击搜索以后,通过GET方法进行传递,比如我们搜索”意“,url变为http://dotamax.com/search/?q=意。但是url中是不允许出现中文字符的,这时候就改用urllib.parse.quote方法对中文字符进行转换。
url = “http://dotamax.com/”
search = “search/?q=” + urllib.parse.quote(“意”)
url1 = url + search
html = urllib.request.urlopen(url1)
本以为这样就可以了但是,执行之后报http.client.RemoteDisconnected: Remote end closed connection without response错误,原来是因为利用 urllib 发起的请求,UA 默认是 Python-urllib/3.5 而在 chrome 中访问 UA 则是 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36,因为服务器根据 UA 来判断拒绝了 python 爬虫,所以要采用下面的方法加上headers将爬虫伪装成浏览器:
法一:
import urllib
url = “http://dotamax.com/”
search = “search/?q=” + urllib.parse.quote(“意”)
url1 = url + search
headers = {‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36’}
req = urllib.request.Request(url1, headers=headers)
file = urllib.request.urlopen(req)
page = file.read()
法二:
import urllib
url = “http://dotamax.com/”
search = “search/?q=” + urllib.parse.quote(“意”)
url1 = url + search
req = urllib.request.Request(url1)
req.add_header(‘User-Agent’,’Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36’)
file = urllib.request.urlopen(req)
page = file.read()注意:
1)经测试urllib.parse.quote(url)和urllib.request.quote(url, encoding=’utf-8’)均可以实现
2)需要注意的是不能对整个url调用quote方法,只能单独对中文字符使用,然后再字符串拼接成完整url
3)urllib.parse.unquote(url)和urllib.request.unquote(url)为刚才的反过程:
urllib.parse.quote(‘意’)—>’%E6%84%8F’
urllib.parse.unquote(‘%E6%84%8F’)—>’意’
改成urllib.request.unquote也同样可以。超时设置
有时我们需要根据自己的需要来设置超时时间,timeout为urlopen的一个参数:
import urllib.request
for i in range(1,100):
try:
file = urllib.request.urlopen(‘http://yum.iqianyue.com‘, timeout = 1)
data = file.read()
print(len(data))
except Exception as e:
print(‘出现异常–》’+str(e))
上述代码中,我们设置了超时时间为1s,循环了99次,有少部分超时- 关于urllib.request.urlretrieve(url,filename)
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
url=”’https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1511086352563&di=1053808d3617835379b9228efe8a60e1&imgtype=0&src=http%3A%2F%2Fpic.yesky.com%2FuploadImages%2F2015%2F169%2F30%2F80I57T1H7XEX.jpg”’
urllib.request.urlretrieve(url, ‘1.jpg’)
测试之道--网络爬虫系列3(urllib库介绍)
最新推荐文章于 2024-08-25 23:24:39 发布