python-爬虫之urllib模块
Posted 奔梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-爬虫之urllib模块相关的知识,希望对你有一定的参考价值。
urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦
1.基本方法
urllib.request.
urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
- url: 需要打开的网址
- data:Post提交的数据
- timeout:设置网站的访问超时时间
直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型。
from urllib import request response = request.urlopen(r\'http://python.org/\') # <http.client.HTTPResponse object at 0x00000000048BC908> HTTPResponse类型 page = response.read() page = page.decode(\'utf-8\')
urlopen返回对象提供方法:
- read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作
- info():返回HTTPMessage对象,表示远程服务器返回的头信息
- getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
- geturl():返回请求的url
2.使用Request
urllib.request.
Request
(url, data=None, headers={}, method=None)
使用request()来包装请求,再通过urlopen()获取页面。
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\')
用来包装头部的数据:
- User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
- Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
- Connection:表示连接状态,记录Session的状态。
3.Post数据
urllib.request.
urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post。
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\') req = request.Request(url, headers=headers, data=data) page = request.urlopen(req).read() page = page.decode(\'utf-8\')
urllib.parse.urlencode
(query, doseq=False, safe=\'\', encoding=None, errors=None)
urlencode()主要作用就是将url附上要提交的数据。
data = { \'first\': \'true\', \'pn\': 1, \'kd\': \'Python\' } data = parse.urlencode(data).encode(\'utf-8\')
经过urlencode()转换后的data数据为?first=true?pn=1?kd=Python,最后提交的url为
http://www.lagou.com/jobs/positionAjax.json?first=true?pn=1?kd=Python
Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码
page = request.urlopen(req, data=data).read()
当然,也可以把data的数据封装在urlopen()参数中
4.异常处理
def get_page(url): 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\') req = request.Request(url, headers=headers) try: page = request.urlopen(req, data=data).read() page = page.decode(\'utf-8\') except error.HTTPError as e: print(e.code()) print(e.read().decode(\'utf-8\')) return page
5、使用代理
urllib.request.
ProxyHandler
(proxies=None)
当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。
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
5、实践
# -*- coding: utf-8 -*- import urllib.request import re import os targetDir = r"D:\\python\\test\\spider\\img\\douban" #文件保存路径 def destFile(path): if not os.path.isdir(targetDir): os.mkdir(targetDir) pos = path.rindex(\'/\') t = os.path.join(targetDir, path[pos+1:]) return t if __name__ == "__main__": #程序运行入口 weburl = "http://www.douban.com/" webheaders = { \'Connection\': \'Keep-Alive\', \'Accept\': \'text/html, application/xhtml+xml, */*\', \'Accept-Language\': \'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3\', \'User-Agent\': \'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko\', #\'Accept-Encoding\': \'gzip, deflate\', \'Host\': \'www.douban.com\', \'DNT\': \'1\' } req = urllib.request.Request(url=weburl, headers=webheaders) #构造请求报头 webpage = urllib.request.urlopen(req) #发送请求报头 contentBytes = webpage.read() contentBytes = contentBytes.decode(\'UTF-8\') for link, t in set(re.findall(r\'(https:[^\\s]*?(jpg|png|gif))\', str(contentBytes))): #正则表达式查找所有的图片 print(link) try: urllib.request.urlretrieve(link, destFile(link)) #下载图片 except: print(\'失败\') #异常抛出
执行过程如下:
打开电脑上对应的文件夹,然后来看看图片,这里只是一部分哦!!。
以上是关于python-爬虫之urllib模块的主要内容,如果未能解决你的问题,请参考以下文章