什么是爬虫?
网络爬虫: (又被称为网页蜘蛛,网络机器人), 是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。通俗的讲: 就是模拟客户端发起网络请求,接收请求的响应,按照一定的规则,自动的抓取互联网信息的程序。原则上只要浏览器能够做的事情,爬虫都能够实现
爬虫的用途
- 搜索引擎
- 咨询新闻网站
- 购物助手(慧慧购物)
- 数据分析与研究积累原始数据资源
- 抢票软件等
爬虫的分类:通用爬虫,聚焦爬虫
通用爬虫:一般情况下使用于搜索引擎,其实也是通过爬虫取获取全互联网的网页,需要在本地进行镜像的备份。是搜索引擎的重要组成部分,尽可能全的爬虫全网的数据,
将获取的页面数据进行本地存储,将获取的数据进行处理(关键词的提取,分词,去广告等)最终将根据用户检索信息,将数据返回给用户
聚焦爬虫:有目的性的获取网页的数据,(面向特定主题的需求)这样会避免获取了大量的无用数据,提高我们获取数据的效率
写一个爬虫具备什么知识?
1.会基本的python基础知识
2.会一些前段知识
3.会一些后端知识
4.会一些数据的存储知识
5.会爬虫知识
为什么用python语言写爬虫?
php:也叫作世界上最好的语言,但是天生不是干爬虫的,对于多任务的支持不太好
java:可以用来写爬虫,并且是python的最大竞争对手,java生态圈比较完善,支持的三方库也很多,但是java代码量非常大,重构的成本很高
c/c++:运行效率高,仅次于汇编语言,但是学习的成本很高,很多底层需要自己写
python:代码简洁,语法优美,支持大量的三方模块,对多任务的支持比较友好,并且有成熟的scrapy爬虫框架和scrapy-redis分布式爬虫框架.
如何完成一个爬虫项目:
1.分析需求,确定目标url(数据源)
2.模拟浏览器,根据url发起请求,获取服务器返回的响应
3.拿到响应结果,提取目标数据
a.将目标数据持久化(文件,数据库)
b.获取当前网页下新的url,执行第二步
4.爬虫结束:直到没有新的url产生,并且带爬虫的url任务全部爬取完毕。
ISO七层协议: TCP/IP
物理层 ------------ 应用层
网络层 ------------ 传输层
传输层 (tcp,udp) ------------ 网络层
会话层 ------------ 物理层
应用层 (http与https)
数据连接层
表示层
tcp:都是传输数据的,长连接,传输的是数据流,安全,稳定 缺点:传输数据慢
udp:传输数据的,短连接,传输的是数据包,快,高效 缺点:不稳定,不安全
http:(超文本传输协议),用于从网络传输超文本数据到客户端。客服端拿到数据后,展示数据
https:功能与http一致,但是多了一个ssl层(安全套接字层),从而能够实现以下两个作用
1.能够实现数据的安全传输,提供一个安全通道
2.能够确定网站的真实性和有效性
http协议的端口号:80
https协议的端口号:443
url uri urn
URI(Uniform Resource Identifier):统一资源标识符
URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,
是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
URN(Universal Resource Name):统一资源名称,只命名资源而不指定如何定位资源
那三者之间有什么关系呢? URI是URL与URN的父类,URN用的很少,我们一般会提到URI和URL,
每一个URL都是一个URI,但是并不是每一个URI都是一个URL.
URL组成部分
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
- scheme:协议(例如:http, https, ftp)
- host:服务器的IP地址或者域名
- port#:服务器的端口(如果是走协议默认端口,缺省端口80)
- path:访问资源的路径
- query-string:参数,发送给http服务器的数据
- anchor:锚(跳转到网页的指定锚点位置)
urllib库的基本使用
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,我们先学习urllib。
我们会从下面三个方面讲解urllib:
- request: 它是最基本的HTTP请求模块,可以用来模拟发送请求,就像在浏览器中输入网址,然后敲击回车键一样,使用的时候只需要给库方法传入相关的URL和相关的参数即可.
- error: 异常处理模块,如果出现请求错误,我们可以使用这个模块来捕获异常,然后进行重试或者其他操作,保证程序不会意外终止.
- parse: 这是一个工具模块,提供了许多url的处理方法,比如拆分,解析,合并等等.
小案例
爬取百度贴吧中美女吧的页面源码
from urllib import request
from urllib.parse import urlencode
def down_load_page_html(startPage,endPage,keyword):
req_header = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 QQBrowser/4.4.108.400',
}
for i in range(startPage,endPage+1):
print('正在下载第'+str(i)+'页,请稍等')
parmas = {
'wd':keyword,
'pn':(i-1)*10,
}
parmas_str = urlencode(parmas)
req_url = 'https://tieba.baidu.com/f?'+parmas_str
req = request.Request(url=req_url,headers=req_header)
response = request.urlopen(req)
name = '第'+str(i)+'.html'
html_str = response.read().decode('utf-8')
with open(name,'w') as f:
print('正在存入第' + str(i) + '页,请稍等')
f.write(html_str)
if __name__ == '__main__':
startPage = int(input('输入起始页码'))
endPage = int(input('输入终止页码'))
keyword = '美女吧'
down_load_page_html(startPage,endPage,keyword)
网友评论