1.背景1.1认识爬虫网络爬虫是按照一定的规则自动抓取互联网信息的程序或脚本。所需的数据。常用的百度、谷歌搜索引擎也是爬虫,从互联网上收集、组合数据,方便用户检索。1.2合法性网络爬虫领域还处于创业阶段,“允许什么行为”的基本秩序还在建设中。如果抓取的数据属于个人使用或者科研的范畴,基本没有问题;如果数据属于商业利益范畴,则必须根据事实来考虑,这可能是非法的,也可能不是。1.3机器人协议机器人协议(又称爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(RobotsExclusionProtocol)。内容网站使用Robots协议告诉搜索引擎如何更有效地索引结果页面并将其提供给用户。它规定了网站中哪些内容可以被抓取,哪些内容不能被抓取。大多数网站都会有一个robots协议,一般存放在网站的根目录下,命名为robots.txt。以知乎为例,https://www.zhihu.com/robots.txt但是robots协议毕竟是行业内的协议,具体怎么弄还是看用户自己了。使用爬虫的时候应该稍微克制一下自己的行为,而不是硬推,看看12306有多惨,被各种抢票软件和爬虫输出...2.要求2.1当前开发环境操作系统:Window10python版本:3.8Editor:pycharmlibrarymanagement:上面的Anconda是我电脑的配置,python版本至少3+;编辑不限,看你喜欢什么;Anconda真的好用,早用早享2.2编程基础你必须有一定的前端知识,知道HTML、CSS、JS的基本用法,了解Python的基本语法。您只需要关注请求的链接和参数,并提供强大的解析功能。Urllib库有四个模块:request、error、parse、robotparserrequest:发起请求(重要)error:处理错误parse:解析RUL或目录等robotparser(不太用):解析robot.txt3.1请求网站模块方法介绍:1、请求方法urllib.request.urlopen(url,data=None,[timeout,]*)url:地址,可以是字符串,也可以是一个请求对象data:请求参数timeout:设置timeout一个简单的get请求:"""#爬虫是模拟用户,向服务器发起请求,服务器会返回相应的数据#数据抓取,使用chrome,尽量不要使用国产浏览器#F12打开界面,点击网络,刷新,会显示网页的请求,常见的请求有GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE,其中GET和POST是最常用的#GETrequestexposes请求参数到URL上面#POST请求的参数放在requestbody,密码通常是加密的#请求头:用于模拟真实用户#对应状态码:200表示成功"""#引入请求模块importurllib.request#发起请求,设置超时时间为1sresponse=urllib.request.urlopen('http://www.baidu.com',timeout=1)#使用read()读取整个页面内容,使用decode('utf-8')获取Encode内容print(response.read().decode('utf-8'))print(response.status)#状态码,判断是否成功,200print(response.getheaders())#从响应头得到的元组列表print(response.getheader('Server'))#获取具体的响应头推荐一个提交各种请求的测试网站:http://httpbin.org/,这个网站的更多用法自行搜索一个简单的post请求importurllib.parse导入urllib。request#data需要字节流编码格式的内容。此时请求方式为postdata=bytes(urllib.parse.urlencode({"name":"WenAn"}),encoding='utf-8')response=urllib.request.urlopen('http://httpbin.org/post',data=data)print(response.read().decode('utf-8'))请求对象浏览器在发起请求头时会有请求头,当爬虫要爬取信息时,添加使服务器认为您是浏览器而不是爬虫的标头urlopen不能添加其他参数,所以我们需要声明一个request对象来添加header如何获取header:打开一个网页(以chrome为例),打开开发者页面快捷键F12或者右键,点network,刷新页面,然后点击一个链接Request引入urllib.request.Request(url,data=None,headers={},method=None)headers:定义请求头method:默认为get,传入参数时,是postExample:importurllib.requestimporturllib.parseurl='http://httpbin.org/post'#添加请求头headers={'user-agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/71.0.3578.98Safari/537.36','Host':'httpbin.org'}dict={'name':'WenAn'}data=bytes(urllib.parse.urlencode(dict),encoding='utf-8')request=urllib.request.Request(url,data=data,headers=headers,method='POST')response=urllib.request.urlopen(request)print(响应。read().decode('utf-8'))3.2错误模块ThError模块下有三个异常类:URLError处理程序在遇到问题时将引发此异常(或其派生异常)。只有一个原因属性。HTTPError是URLError的子类,具有更多的属性。比如code、reason、headers适合处理认证请求等特殊的HTTP错误。ContentTooShortError当urlretrieve()函数检测到下载的数据量小于预期量(由Content-Length标头给出)时,会引发此异常。下载的(可能被截断的)数据将存储在content属性中。例1.fromurllibimportrequest,errortry:#打开百度中的a.html页面,因为根本不存在,所以会抛出异常response=request.urlopen('http://www.baidu.com/a.html')excepterror.URLErrorase:print(e.reason)#NotFound示例2.#同样的示例,但是将URLError替换为来自urllibimportrequest的HTTPError,errortry:response=request.urlopen('http://www.baidu.com/a.html')excepterror.HTTPErrorase:print(e.reason)print(e.code)print(e.headers)#输出结果"""NotFound404Content-Length:204Connection:keep-aliveContent-Type:text/html;charset=iso-8859-1Date:星期六,2021年9月18日14:18:51GMTKeep-Alive:timeout=4Proxy-Connection:keep-aliveServer:Apache"""3.3Parsemoduleparse模块定义了url的标准接口,实现了url的各种提取、解析、合并、编码、解码。urlencode()简介---参数编码它将字典结构中的参数序列化为url编码的字符串。前面的request模块很有用--ChineseURLcodecimporturllib.parseparams='韩寒失忆'base_url='https://www.baidu.com/s?wd='url=base_url+urllib.parse.quote(params)print(url)#https://www.baidu.com/s?wd=%E6%86%A8%E6%86%A8%E6%B2%A1%E4%BA%86%E5%BF%83#使用unquote()解码中文url1='https://www.baidu.com/s?wd=%E6%86%A8%E6%86%A8%E6%B2%A1%E4%BA%86%E5%BF%83'print(urllib.parse.unquote(url1))#https://www.baidu.com/s?wd=憨憨脑残urlparse()介绍——URL分割urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)urlstring:urlscheme=''tobeparsed:如果解析出来的url没有协议,可以设置默认协议,如果url有协议,设置该参数无效allow_fragments=True:是否忽略锚点和片段标识符,如'#',默认True忽略,False忽略示例1.fromurllib.parseimporturlparsea=urlparse("https://docs.python.org/zh-cn/3/library/urllib.parse.html")print(a)#返回一个数组,是url的拼接部分,可以访问具体值#ParseResult(scheme='https',netloc='docs.python.org',path='/zh-cn/3/library/urllib.parse.html',params='',query='',fragment='')print(a.scheme)print(a.netloc)print(a.path)print(a.params)print(a.query)print(a.fragment)"""scheme:表示协议netloc:域名path:路径params:参数query:查询条件,一般为get请求的urlfragment:锚点,用于直接定位页面的下拉location,跳转到网页指定位置"""urlunparse()介绍----URL构建importurllib.parseurl_params=('http','baidu.com','/a','','','')url=urllib.parse.urlunparse(url_params)print(url)#http://baidu.com/aurljoin()介绍----URL拼接#给一个baseurl,给一个后缀url,拼接自urllibimportparsebase_url='http://www.cwi.nl/%7Eguido/Python.html'sub_url='FAQ.html'url=parse.urljoin(base_url,sub_url)print(url)#http://www.cwi.nl/%7Eguido/FAQ.html4.进阶应用4.1Openeropener是urllib.request.OpenerDirector的一个实例,上面说了urlopen是一个特殊的opener,已经建好了,但是urlopen()只提供了最基本的功能,如果不支持proxy、cookie等自定义Opener进程,则使用相关的Handler处理器创建一个具有特定功能的处理器对象,使用处理器对象通过urllib.request.build_opener()方法创建自定义opener对象using一个自定义的Opener对象,调用open()方法发送请求关于全局Opener如果程序中的所有请求都需要使用自定义的opener,使用urllib.request.install_opener()importurllib.request#createhandlerhttp_handler=urllib.request.HTTPHandler()#创建openeropener=urllib.request.build_opener(http_handler)#创建一个Request对象request=urllib.request.Request('https://www.python.org/')#部分opener,只能使用.open()访问#response=opener.open(request)#全局opener,在调用urlopen之后,会使用这个自定义的openerurllib.request.install_opener(opener)response=urllib.request.urlopen(request)print(response.read().decode('utf8'))4.2Proxy设置Proxy原理正常过程:本机请求访问一个网站,向web服务器发送请求,web服务器将相应的数据回传给代理:本机之间出现第三方和服务器,本地机向代理服务器发送请求,代理服务器向Web服务器发送请求,相应的数据通过代理服务器转发回本地机。使用代理IP更方便的爬取数据。很多网站都会查看某个IP在某个时间段内的访问量。如果访问量过大,出现异常,将封禁该IP,禁止其访问网站。通过使用代理,您可以每隔一段时间更换一次代理。如果某个IP被ban了,可以通过更换IP继续爬取数据。下面介绍几个提供免费代理服务的网站:http://www.xiladaili.com/https://www.kuaidadaili.com/free/https://ip.jiangxianli.com/?p...moreSearch你自己的IP上网,没人能保证这些免费IP什么时候会用到'223.100.166.3','http':'113.254.178.224','http':'115.29.170.58','http':'117.94.222.233'})#创建openeropener=urllib.request.build_opener(proxy_handler)header={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/93.0.4577.82Safari/537.36"}request=urllib.request.Request('https://www.httpbin.org/get',headers=header)#配置全局openerurllib.request.install_opener(opener)response=urllib.request.urlopen(request)print(response.read().decode('utf-8'))4.3CookieCookie是网站为了识别用户身份而存储在本地的数据,一种d数据通常是加密的。Cookie主要用于以下三个方面:会话状态管理(如用户登录状态、购物车、游戏得分或其他需要记录的信息)个性化设置(如用??户自定义设置、主题等)浏览器行为跟踪(如跟踪分析用户行为等)cookielib库该模块的主要功能是提供可以存储cookie的对象。使用此模块捕获cookie并在后续连接请求中重新发送它们。它还可用于处理包含cookie数据的文件。该模块主要提供这几个对象,CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。CookieJar:对象存储在内存中FileCookieJar、MozillaCookieJar、LWPCookieJar:存储在文件中,生成相应格式的cookie文件,一般使用两种获取Cookieimporthttp.cookiejarimporturllib.request#createcookieobjectcookie=http.cookiejar.CookieJar()handler=urllib.request.HTTPCookieProcessor(cookie)opener=urllib.request.build_opener(handler)response=opener.open('http://www.baidu.com')#得到响应后,cookie会自动为iincookie赋值:print(i.name+"="+i.value)本地保存cookieimporthttp.cookiejarimporturllib.requestfilename='cookie.txt'#cookie=http.cookiejar.MozillaCookieJar(filename)cookie=http.cookiejar.LWPCookieJar(filename)handler=urllib.request.HTTPCookieProcessor(cookie)opener=urllib.request.build_opener(handler)#得到response后会自动分配cookieresponse=opener.open('http://www.baidu.com')#保存cookie.txt文件cookie.save(ignore_discard=True,ignore_expires=True)读取cookie文件importurllib.requestimporthttp.cookiejar#cookie对象必须和产生cookie文件的对象一致,不管是LWP还是Mozilla#cookie=http.cookiejar。MozillaCookieJarcookie=http.cookiejar.LWPCookieJar()cookie.load('cookie.txt',ignore_expires=True,ignore_discard=True)handler=urllib.request.HTTPCookieProcessor(cookie)opener=urllib.request.build_opener(handler)response=opener.open("http://www.baidu.com")print(response.read().decode('utf-8'))以上是urllib的常用内容。附上urllib参考文档:https://docs.python.org/zh-cn...这是python爬虫系列的第一篇图文教程,后续会陆续发布新内容。关注公众号:【求码】及时获取最新推文资讯。给我点个赞~
