爬虫知识学习

爬虫背景知识:

大数据时代?数据怎么来的呢?
企业产生的数据:大的公司会根据用户的行为记录数据,数据会被大公司利用,可以用来做数据的
分析
数据平台的数据:
政府和机构的数据:
数据咨询平台的数据:

爬虫:以上平台或者机构不能够提供我们需要的数据,这时就需要爬虫工程师,根据需求从互联网
上抓取数据

什么是爬虫?

就是一段自动抓取互联网的程序或脚本

网页的三大特性:

1、每一个网页都有自己唯一的URL地址(统一资源定位符)
2、网页都是通过HTML(超文本)来展示数据的
3、网页是通过http/https(超文本传输协议)来传输html的

爬虫最基本的步骤:
1、寻找目标url,发起请求
2、获取请求的响应结果,分析响应结果
3、从响应结果中提取数据
a、第一部分,从网页中提前的目标数据
b、如果存在新的url地址,则提取,继续发起请求

爬虫结束:所有的目标url全部请求完毕,爬虫结束

数据的用途:
1、可以爬取数据,写自己的网址
2、搜索引擎
3、购物助手
4、日常数据的基本信息(知乎数据冰山专栏)

做爬虫并不只有python可以完成:
java php c/c++ switch ...

java:是python写爬虫的最大的竞争对手,java的发展周期长,对于各个模块(生态圈)都比较完善,也
有很多第三方库的支持,java的代码量比较大,开发的成本比较高,后期维护也比较繁琐。

php:php曾经被叫做世界上最好的语言(一般用来做后端的),也可以用来写爬虫,但是对多任务的支
持不太好,爬虫对效率要求比较高,php一般不适用写爬虫

c/c++:比较偏向于底层的语言,代码的运行效率高,学习的门槛非常高,代码成型比较慢。

python:代码简单易懂,并且第三方的库也有很多,python自带的urllib网络请求模块,requests网
络请求模块,网络解析库xpath,BeautifulSoup4,pyquery等等,还有成熟高校稳定的爬虫框架scrapy
(pyspider)等等,并且还支持分布式爬虫(scrapy-redis)框架

爬虫的分类(通用爬虫,聚焦爬虫):
通用爬虫:是搜索引擎的重要组成部分
作用和目的:尽可能全的将互联网上所有的网页下载到本地,通过分词,去噪等进行处理,处理后
进行数据的持久化(镜像备份),然后提供检索系统

获取数据的步骤:
a:获取一些种子url,放入待爬取队列
b:从待爬取队列中取出url发起请求,将获取的响应结果进行处理,之后存入本地,然后将已爬取
的url,放入已爬取队列
c:从响应结果中获取外链(url),将url放入爬取队列中

搜索引擎如何获取新网站的url:
1、向搜索引擎直接提交url地址
2、通过网页的外链
3、跟DNS服务商合作

在终端下载加豆瓣:比如下载pymysql:pip3 install pymysql -i https://pypi.douban.com
/simple/

主键和唯一的区别是一个可以为空,一个不可以为空

爬虫代码基本步骤:

step1:分析网站,寻找目标url
step2:分析目标url参数((get,post)
get请求参数部分:把?后面的参数写在字典中,然后使用parse.urlencode(字典参数),得到了url
编码格式的字符串

post请求参数部分:是处理表单数据,将表单数据放在字典里,然后使用parse.urlencode(字典参数)
得到了url编码格式的字符串,最后使用encode方法将字符串转为bytes类型。

step3(发起请求):
1、设置请求头,添加UA (cookie,referer)
2、实例化一个Request对象(request.Request)
3、根据实例化的Request对象,使用request.urlopen()方法发起请求

step4(处理响应结果):
1、Ajax请求得到的一般是json数据,使用json模块处理使用json.loads将json字符串,转为python
数据类型
2、对于非结构化数据(数据在html页面中),可以使用re正则提取数据(xpath,BeautifulSoup,pyquery
)。
3、如果还有其他url,则继续发起请求

step5(数据持久化):
1、文件存储(json,csv,txt...)
2、数据库存储((mysql,mongodb,redis)

正则的规则:(作用:处理字符串)

单字符匹配
. 除换行符之外的任意字符
\d 表示数字
\D 匹配非数字
\w 匹配单词字符[a-z,A-Z,0-9]
\W 匹配非单词字符
\s 匹配空白字符,空格,\n,\t ...
\S 匹配非空白字符
^ 匹配以...开头
$ 匹配以....结尾
[0-9] 匹配0到9

多字符匹配(贪婪匹配)----尽可能多的匹配

  • 匹配*前面的字符任意次数
  • 匹配+前面的字符至少一次
    ?匹配?前面的字符0次或1次
    {n,m} 匹配{n,m}前面的字符n~m次

多字符匹配(非贪婪匹配)----尽可能少的匹配
*?
+?
??

其他
() 分组
| 逻辑或
\ 转义字符

方法:
re模块下的方法
import re
re.compile(): 构建正则表达式对象
re.match(): 从起始位置开始匹配,单词匹配,匹配到结果立即返回,反之返回None
re.search(): 在整个字符串中进行匹配,单词匹配,匹配大盘结果立即返回,反之返回None
获取的话print(名字.group())
re.findall(): 匹配出整个字符串中所有符合正则规则的结果,返回的是列表
re.finditer(): 匹配出整个字符串中所有符合正则规则的结果,返回的是一个可迭代对象
re.sub(): 根据正则表达式进行字符串替换
re.split(): 正则表达式进行分割,分割得到是一个list

你可能感兴趣的:(爬虫知识学习)