在上面的来源中:人工的方式费时费力,免费的数据网站上的数据质量不佳,很多第三方的数据公司他们的数据来源往往也是爬虫获取的,所以获取数据最有效的途径就是通过爬虫爬取
百度新闻,一家并不是做新闻的公司,这个网站上的新闻数据从哪里来的呢?
他的新闻数据都是其他网站上的,在百度新闻上仅仅做了展示,如果后续我们要做一个网站,天天新闻,是不是也可以这样做呢
那么同样的,我们后续想要做一个和网易云音乐类似的音乐网站,是不是也可以这样来做呢?
通过前面的列子,能够总结出:
爬虫获取的数据的用途:
- 进行在网页或者是app上进行展示
- 进行数据分析或者是机器学习相关的项目
网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做
12306抢票
网站上的投票
短信轰炸
在上一小结中,我们介绍爬虫爬取到的数据用途
的时候,给大家举了两个例子,其实就是两种不同类型的爬虫
根据被爬网站的数量的不同,我们把爬虫分为:
通用爬虫:通常指搜索引擎的爬虫
聚焦爬虫:针对特定网站的爬虫
请思考:如果自己要实现一个和百度新闻一样的网站需要怎么做?
但是搜索引擎类似的通用爬虫的工作流程有些不同
通用搜索引擎所返回的网页里90%的内容无用。
图片、音频、视频多媒体的内容通用搜索引擎无能为力
不同用户搜索的目的不全相同,但是返回内容相同
Robots协议:网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,但它仅仅是道德层面上的约束
例如:淘宝的robots协议
HTTP
- 超文本传输协议
- 默认端口号:80
HTTPS
- HTTP + SSL(安全套接字层)
- 默认端口号:443
HTTPS比HTTP更安全,但是性能更低
浏览器会主动请求js,css等内容,js会修改页面的内容,js也可以重新发送请求,最后浏览器渲染出来的内容在elements中,其中包含css,图片,js,url地址对应的响应等。
但是在爬虫中,爬虫只会请求url地址,对应的拿到url地址对应的响应
浏览器渲染出来的页面和爬虫请求的页面并不一样
所以在爬虫中,需要以url地址对应的响应为准来进行数据的提取
url的形式:scheme://host[:port#]/path/…/[?query-string][#anchor]
这个图大家见过很多次,那么在浏览器headers中,点击view source来具体观察其中的请求行,请求头部和请求数据是什么样子的
get请求和post请求的区别可以参w3school
常见的状态码:
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等
字符集(Character set)是多个字符的集合
字符集包括:ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等
ASCII编码是1个字节,而Unicode编码通常是2个字节。
UTF-8是Unicode的实现方式之一,UTF-8是它是一种变长的编码方式,可以是1,2,3个字节
了解更多请看故事:ascii和unicode以及utf-8的起源
python3中两种字符串类型:
str:Unicode的呈现形式
bytes:字节类型,互联网上数据的都是以二进制的方式(字节类型)传输的
使用方法:
编码方式解码方式必须一样,否则就会出现乱码
python2中字符串有两种类型
在Python2中,字符串无法完全地支持国际字符集和Unicode编码。为了解决这种限制,Python2对Unicode数据使用了单独的字符串类型。要输入Unicode字符串字面量,要在第一个引号前加上'u'。
Python2中普通字符串实际上就是已经编码(非Unicode)的字节字符串。
python2 中定义字符串的时候,会自动将字符串转换为合适编码的字节字符串,比如中文:自动转换为utf-8编码的字节字符串
看下面的例子:
>>> a = "传智播客" #如此定义字符串的时候,其为字节类型
>>> a '\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'
>>> type(a)
上面的这种定义和在字符串前面加上b的效果一样
>>> c = b"传智播客"
>>> c
'\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'
>>> type(c)
>>> c.decode("utf-8")
u'\u4f20\u667a\u64ad\u5ba2'
由于a已经是字节类型,所以只能对其进行解码,转化为str类型
>>> a.encode("utf-8")
Traceback
(most recent call last): File "", line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> a.decode("utf-8")
u'\u4f20\u667a\u64ad\u5ba2'
如果需要定义unicode字符串,即非字节类型的字符串的时候需要在前面加上u
>>> b = u"传智播客"
>>> b u'\u4f20\u667a\u64ad\u5ba2'
>>> type(b)
>>> b.encode("utf-8") '\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'
>>> b
u'\u4f20\u667a\u64ad\u5ba2'
>>> b.encode()
Traceback
(most recent call last): File "", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
>>> b.encode("utf-8") '\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'