大家好,关于csdn资源解析网站源码分享很多朋友都还不太明白,今天小编就来为大家分享关于在线解析网站源码的知识,希望对各位有所帮助!
网络库urllib
urllib库是Python3内置的HTTP请求库,不需要单独安装,默认下载的Python就已经包含了该库。
urllib库有4个模块:
1.request:最基本的HTTP请求模块,可以用法发送HTTP请求,并接收服务器的响应数据,这个过程就像在浏览器地址栏输入URL一样。
2.parse:工具模块,提供了很多处理URL的API,如拆分、解析、合并等。
3.robotparser:用来识别网站的robots.txt文件,然后判断哪些网站可以抓取,哪些不能抓取。
4.error:异常处理。如果出现请求错误,可以捕获这些异常,然后根据代码的需要,进行处理。
下面,我们来分别介绍urllib库这4个模块。
request
request模块,包含发送请求,获得响应,Cookie,代理等相关API。这里,我们分别来介绍其使用的方式。
发送GET请求
首先,我们一般进行爬虫程序编写时,开始都需要发送请求,然后获得响应进行处理。比如通过GET请求获取网页源代码,示例如下:
importurllib.request\n\nresponse=urllib.request.urlopen(&34;)\nprint(response.read().decode(&34;))
如上面代码所示,运行之后,我们会得到网页html源代码。
这里response是一个HTTPResponse对象,调用它多种方法及其属性,就可以进行多样的处理。
比如,我们这里来获取CSDN首页,调用其属性及其方法,示例如下:
importurllib.request\n\nresponse=urllib.request.urlopen(&34;)\nprint(&34;,response.status,&34;,response.msg,&34;,response.version)\nprint(response.getheaders())
这里,我们输出了CSDN首页的响应状态码,响应消息以及HTTP版本的属性,同时也打印其完整的响应头信息。
发送POST请求
默认request.urlopen()函数发送的GET请求,如果需要发送POST请求,我们需要使用data命令参数,该参数类型是bytes。示例代码如下:
importurllib.request\nimporturllib.parse\n\ndata=bytes(urllib.parse.urlencode({&39;:&39;,&39;:&39;}),encoding=&34;)\nresponse=urllib.request.urlopen(&34;,data=data)\nprint(response.read().decode(&34;))
运行之后,如果请求成功就会返回一大堆字符串数据。
请求超时处理
在实际的爬虫项目中,我们都需要考虑一个关键的问题,那就是请求超时。如果请求网址因为长时间没有响应,那么卡在这里往往浪费大量的资源。
所以,我们需要设置一个超时时间,如果在限定的时间没有响应,就应该重新抓取,或者不再抓取。示例代码如下:
importurllib.request\nimporturllib.parse\nimporturllib.error\nimportsocket\n\ndata=bytes(urllib.parse.urlencode({&39;:&39;,&39;:&39;}),encoding=&34;)\ntry:\nresponse=urllib.request.urlopen(&34;,data=data,timeout=0.1)\nprint(response.read().decode(&34;))\nexcepturllib.error.URLErrorase:\nifisinstance(e.reason,socket.timeout):\nprint(&34;)\nfinally:\nprint(&34;)
爬虫伪装
现在只要是知名的网站,都具有定义的防爬虫技术。所以,我们在开发爬虫程序时,需要将自己的请求伪装成浏览器。
不过,urlopen()并没有header请求头参数,我们需要使用request.Request()进行构造请求,示例代码如下:
importurllib.request\nimporturllib.parse\n\ndata=bytes(urllib.parse.urlencode({&39;:&39;,&39;:&39;}),encoding=&34;)\nheaders={\n&39;:&39;\n}\nreq=urllib.request.Request(&34;,data=data,headers=headers)\nresponse=urllib.request.urlopen(req)\nprint(response.read().decode(&34;))
这里,我们将爬虫程序伪装成从火狐浏览器进行的请求。
当然,Request类还有许多其他的信息,下表是博主列出来供读者参考使用的。
参数
意义
url
用于发送请求的URl,必选参数(除这个参数之外,其他参数可选)
data
要提交的表单数据,必须是bytes类型
headers
请求头
origin_req_host
请求方的host名称或IP地址
unverifiable
表示这个请求是否是无法验证的,默认是False,主要是说明用户没有足够的权限来选择接收这个请求的结果。举个例子,请求一个HTML的图像,但没有自动抓取图像的权限,这个时候该参数为True
method
用来指定是什么请求,比如GET,POST,PUT等,如果指定了data,默认就是POST请求
需要注意的是最后一个参数method,如果你在程序中,即指定了请求是GET,同时也有data表单数据,那么默认表单不会提交给服务器。
代理
其实,服务器除了根据请求头进行判断是否为爬虫之外,最简单判别爬虫的方式,就是判断是否是同一个IP短时间大量访问。
如果同一个IP短时间大量访问,那么可以直接判别为爬虫程序。而这个时候,我们可以通过代理进行伪装。当然,使用代理时应该不断更换代理服务器。
示例代码如下:
importurllib.error\nfromurllib.requestimportProxyHandler,build_opener\n\nproxy_handler=ProxyHandler({\n&39;:&39;,\n&39;:&39;\n})\nopener=build_opener(proxy_handler)\ntry:\nresponse=opener.open(&39;)\nprint(response.read().decode(&39;))\nexcepturllib.error.URLErrorase:\nprint(e.reason)
运行之后,与前文一样返回CSDN首页的源代码。不过,需要注意的是,博主在写博客时,这个代码IP是有效的,但如果你读到这篇博文,可能已经失效了,你需要自己去找免费的代理服务器测试。
获取Cookie
一般来说,当我们使用爬虫登录网站之后,会使用服务器返回的Cookie进行操作,有了这个Cookie,服务器就知道我们已经登录过。
那么如果获取Cookie数据呢?示例如下:
importurllib.error\nfromurllib.requestimportProxyHandler\nimporthttp.cookiejar\n\ncookie=http.cookiejar.CookieJar()\nhandler=urllib.request.HTTPCookieProcessor(cookie)\nopener=urllib.request.build_opener(handler)\ntry:\nresponse=opener.open(&39;)\nforitemincookie:\nprint(&34;,item.name,&34;,item.value)\nexcepturllib.error.URLErrorase:\nprint(e.reason)
如上面代码所示,我们可以通过http.cookiejar库进行操作,这里会返回cookie的键值对,并输出打印,效果如下:
如果本身网站的Cookie时效比较长的话,那么一次爬虫之后,我们可以将其保存在使用,这个时候会用到MozillaCookieJar类与LWPCookieJar类。
这2个类会在获取Cookie的同一时间,将Cookie分别保存为Mozilla浏览器格式和libwww-perl(LWP)格式。示例代码如下:
importurllib.error\nfromurllib.requestimportProxyHandler\nimporthttp.cookiejar\n\ncookie=http.cookiejar.MozillaCookieJar(&39;)\nhandler=urllib.request.HTTPCookieProcessor(cookie)\nopener=urllib.request.build_opener(handler)\ntry:\nresponse=opener.open(&39;)\ncookie.save(ignore_discard=True,ignore_expires=True)\nexcepturllib.error.URLErrorase:\nprint(e.reason)
运行之后,会生成一个cookies.txt文件,具体内容如下:
而LWPCookieJar类的使用方式与上面MozillaCookieJar类似,这里不再赘述。至于读取通过cookie.load()方法进行加载Cookie。
Parse
在实际的爬虫处理中,我们经常会遇到各种的编码问题。而这些问题就可以通过Parse进行解决处理。
中文的编码与解码
比如,在某些网址的请求头中,有些网站请求头会含有中文。但默认不进行任何处理肯定会报UnicodeEncodeError错误。
读者可以通过上面的代码,在headers字典中添加一个键值对,让值取中文试试。下面,我们需要对其进行编码,示例如下:
importurllib.parse\nimportbase64\n\nvalue=urllib.parse.urlencode({&39;:&39;})\nprint(&34;,value)\nprint(&34;,urllib.parse.unquote(value))\n39;学习网络urllib库&34;UTF-8&34;编码后的中文:&34;解码后的中文:&34;UTF-8&39;https://www.baidu.com/s?wd=&34;王者荣耀&39;https://www.csdn.net/&39;scheme:&网络协议\nprint(&39;,result.netloc)39;path:&文件存放路径\nprint(&39;,result.query)39;fragment:&拆分文档中的特殊猫
运行之后,效果如下:
连接URL
对于URL来说,有时候我们需要将URL的多个部分进行组合。比如,我们在爬取某一个网站下图片时,其默认的前部分基本都相同,可能只是ID不同。
那么这个时候,我们需要将前部分URL与ID进行拼接。示例代码如下:
importurllib.parse\n\nprint(urllib.parse.urljoin(&39;,&39;))\nprint(urllib.parse.urljoin(&39;,&39;))\nprint(urllib.parse.urljoin(&39;,&39;))\nprint(urllib.parse.urljoin(&39;,&39;))
运行之后,效果如下:
urljoin的使用规则:第1个参数是base_url,是一个基URL,只能设置scheme、netloc和path,第2个参数是url。
如果第2个参数不是一个完整的URL,会将第2个参数的值加到第1个参数的后面,自动添加斜杠&34;name=李元静&age=29&一种解析方式\nrobot=RobotFileParser()\nrobot.set_url(&39;)\nrobot.read()\nprint(robot.can_fetch(&39;,&39;))\n\n39;https://www.csdn.net/robots.txt&39;*&39;https://blog.csdn.net/rank/list'))
这里,can_fetch方法用来判断该网址根据Robots协议是否可以抓取。这里判断的是CSDN排行榜能否抓取,返回了True。
error
异常处理在上面的代码中,我们已经用过了。比如在请求超时的讲解之中,我们用到了URLError。但是它还有一个子类HTTPError。
HTTPError
它主要用于HTTP请求错误的处理,比如400,404等错误。
HTTPError有3个重要的参数:
1.code:服务器返回的状态码,如404等2.reason:返回错误的原因3.headers:返回请求头
不过,HTTPError不能捕获超时错误,如果你需要处理超时错误,那么只能通过URLError进行捕获。
关于csdn资源解析网站源码分享,在线解析网站源码的介绍到此结束,希望对大家有所帮助。