标签:live lin decode readlines timeout safe 字符串 mem pos
urllib是python的一个获取url(Uniform Resource Locators,统一资源定位符),可以用来抓取远程的数据。
urllib.request.urlopen(url, data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
urllib.request.urlopen() 可以获取页面,获取页面内容的数据格式为bytes类型,需要进行decode()解码,转换成str类型。
参数说明:
from urllib import request
response = request.urlopen("http://members.3322.org/dyndns/getip")
# <http.client.HTTPResponse object at 0x031F63B0>
page = response.read()
# b‘106.37.169.186\n‘
page = page.decode("utf-8")
# ‘106.37.169.186\n‘
urlopen返回对象提供的方法:
urllib.request.Request(url,data=None,headers={},method=None)
from urllib import request
url = r‘http://www.lagou.com/zhaopin/Python/?labelWords=label‘
headers = {
‘User-Agent‘: r‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ‘
r‘Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3‘,
‘Referer‘: r‘http://www.lagou.com/zhaopin/Python/?labelWords=label‘,
‘Connection‘: ‘keep-alive‘
}
req = request.Request(url, headers=headers)
page = request.urlopen(req).read()
page = page.decode(‘utf-8‘)
urllib.parse.urlencode(query, doseq=False,safe=‘‘,encoding=None,errors=None)
urlencode()的主要作用就是将url附上要提交的数据.
from urllib import request, parse
url = r‘http://www.lagou.com/jobs/positionAjax.json?‘
headers = {
‘User-Agent‘: r‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ‘
r‘Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3‘,
‘Referer‘: r‘http://www.lagou.com/zhaopin/Python/?labelWords=label‘,
‘Connection‘: ‘keep-alive‘
}
data = {
‘first‘: ‘true‘,
‘pn‘: 1,
‘kd‘: ‘Python‘
}
data = parse.urlencode(data).encode(‘utf-8‘)
# 此时data是字节 b‘first=true&pn=1&kd=Python‘ ,POST的数据必须是bytes或者iterable of bytes,不能是str,因此需要encode编码
# 经过urlencode转换后的data数据为‘first=true&pn=1&kd=Python‘
# 最后提交的url为:http://www.lagou.com/jobs/positionAjax.json?first=true?pn=1?kd=Python
req = request.Request(url, headers=headers, data=data)
# 此时req : <urllib.request.Request object at 0x02F52A30>
page = request.urlopen(req).read()
# 此时page是字节: b‘{"success":false,"msg":"\xe6\x82\xa8\xe6\x93\x8d\xe4\xbd\x9c\xe5\xa4\xaa\xe9\xa2\x91\xe7\xb9\x81,\xe8\xaf\xb7\xe7\xa8\x8d\xe5\x90\x8e\xe5\x86\x8d\xe8\xae\xbf\xe9\x97\xae","clientIp":"106.37.169.186"}\n
page = page.decode(‘utf-8‘)
# 此时page是字符串:"success":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"106.37.169.186"}
当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。
from urllib import request, parse
data = {
‘first‘: ‘true‘,
‘pn‘: 1,
‘kd‘: ‘Python‘
}
proxy = request.ProxyHandler({‘http‘: ‘5.22.195.215:80‘}) # 设置proxy
opener = request.build_opener(proxy) # 挂载opener
request.install_opener(opener) # 安装opener
data = parse.urlencode(data).encode(‘utf-8‘)
page = opener.open(url, data).read()
page = page.decode(‘utf-8‘)
return page
文章参考:https://www.cnblogs.com/Lands-ljk/p/5447127.html
标签:live lin decode readlines timeout safe 字符串 mem pos
原文地址:http://www.cnblogs.com/wang-yc/p/7999364.html