python3爬虫学习笔记(一)初入爬虫 urllib学习

一、爬虫是什么

网络爬虫(也叫做网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。如果把互联网比做成一个大的蜘蛛网,蜘蛛网上每个节点都有大量的数据,爬虫就像一只小蜘蛛通过网页的地址找到网站并获取信息:HTML代码/JSON数据/二进制数据(图片、视频)。

二、URL--有了地址爬虫才知道去哪里爬

浏览器对应的地址就是URL,例如https://www.baidu.com/?tn=02049043_62_pg

URL的格式:(带方括号[]的为可选项)protocol :// hostname[:port] / path / [;parameters][?query]#fragment

(1)protocol(协议):指定使用的传输协议

(2)hostname(主机名):是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。

(3)port(端口号):整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。

(4)path(路径):由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

三、urllib

在python中,学习爬虫经常要使用到urllib这个模块,下面结合一些实例来介绍一下urllib。

urllib中包括了四个模块:urllib.request , urllib.error , urllib.parse , urllib.robotparser

urllib.request :用来打开和读取URL

urllib.error:包含了urllib.request产生的异常

urllib.parse:用来解析和处理URL

urllib.robotparse:用来解析页面的robots.txt文件

(1)urllib.request模块--打开和读取网站

简单的打开和读取网站

urllib.request.urlopen(url):用来打开一个网站(其实还有别的参数,具体可以去查python里面的help)

返回来的如同一个文本,可以采用read()来读取 

import urllib.request

response = urllib.request.urlopen("https://www.baidu.com")
html = response.read()
print(html)

这个时候的到的结果,但都是二进制乱码

​
b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://
","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-
equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>'
>>> 

这个时候可以加上decode()将网页的代码进行解析,但是要去网页代码里面找到编码格式为utf-8(审查元素,在head点开,charset那里)

import urllib.request

response = urllib.request.urlopen("https://www.baidu.com")
html = response.read()
html = html.decode("utf-8")
print(html)
<html>

<head>

	<script>

		location.replace(location.href.replace("https://","http://"));

	</script>

</head>

<body>

	<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>

</body>

</html>

整个结果就会变得工整很多

额外的问题:获取编码方式

这里遇到了一个问题,关于编码方式的获取有点麻烦,这里查了别的方法来获取编码方式:

用第三方库chardet里面chardet.detect()就可以的到一个包含了编码方式的字典

import chardet
import urllib

url="https://www.baidu.com"

content = urllib.urlopen(url).read()
result= chardet.detect(content)#这里得到的是一个字典
encoding = result['encoding']#得到字典里面的编码方式
print(encoding)

除了read()其它读取网站的方式

geturl():返回URL的一个字符串

info():返回的是meta标记的的信息(html网页源码中一个重要的html标签,例如作者、日期和时间、网页描述、关键词、页面刷新等)

getcode():返回的是http的状态码,如果返回的是200表示请求成功(表示网页服务器HTTP响应状态的3位数字代码,由 RFC 2616 规范定义)

import urllib.request

url="https://www.baidu.com"

html = urllib.request.urlopen(url)
print("geturl:%s\n"%(html.geturl()))
print("info:%s\n"%(html.info()))
print("getcode:%s\n"%(html.getcode))
geturl:https://www.baidu.com

info:Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 227
Content-Type: text/html
Date: Sun, 22 Jul 2018 03:01:02 GMT
Etag: "5b3c3650-e3"
Last-Modified: Wed, 04 Jul 2018 02:52:00 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BD_NOT_HTTPS=1; path=/; Max-Age=300
Set-Cookie: BIDUPSID=98CE4FF720D964752DFFF7F8757770E8; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1532228462; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=0
X-Ua-Compatible: IE=Edge,chrome=1
Connection: close



getcode:<bound method HTTPResponse.getcode of <http.client.HTTPResponse object at 0x0415C290>>

用urlopen的data参数向服务器发送数据

data是urlopen里面可选的参数,可以向服务器发送数据(根据http的规范,GET用于获取信息,POST向服务器提交数据)。如果你传递了这个data参数,它的请求方式就不再 是GET方式请求,而是POST。但是data是字节流编码格式的内容,即bytes类型,可以通过接下来学到的urllib.parse.urlencode()函数将字符串自动转换为上述格式。

下一篇继续介绍urllib其它模块的使用。。。

猜你喜欢

转载自blog.csdn.net/qq_40306845/article/details/81146759
今日推荐