网络爬虫概论

网络爬虫概论


爬虫:网络爬虫机器人,从互联网自动抓取数据的程序
理论上:通过浏览器看到的数据,我们一般都是可以获取到的

第1章 爬虫的作用:

  • 1.1 搜索引擎
  • 1.2 商品比价(电商商品销售量统计分析)
  • 1.3 数据分析平台(豆瓣,知乎专栏等)

第2章 网页的三大特征:

  • 2.1 每一个网页都有一个唯一的url(统一资源定位符),来进行定位
  • 2.2 网页都是通过HTMl(超文本)文本展示的
  • 2.3 所有的网页都是通过http<超文本传输协议>(HTTPS)协议来传输的

第3章 爬虫的流程:

  • 3.1 分析网站,得到目标url
  • 3.2 根据url,发起请求,获取页面的HTML的源码
  • 3.3 从页面源码中提取数据
    • a. 提取目标数据,做数据的筛选和持久化存储
    • b. 从页面中提取到新的url地址,继续执行第二部操作
  • 3.4 爬虫结束:所有的目标url都提取完毕,并且得到了数据,再也没有其他请求任务了,这是意味着爬虫结束

第4章 通用爬虫抓取网页的流程:

  • 4.1 选取一部分的url作为种子url,将这些url放入到带爬取得任务队列里
  • 4.2 从带爬取得任务队列中取出url,发起请求,将获取到的页面源码存储到本地,并将已经爬取过的url,放入已爬取队列中
  • 4.3 从已爬取url的响应结果中,分析提取其他的url地址,继续添加到带爬取队列中,之后就是不断的循环,查到所有的url都提取完毕

第5章 通用爬虫的缺点:

  • 5.1 必须遵守roobot协议:就是一个规范,告诉搜索引擎,哪些目录下的资源允许爬虫,哪些目录下的资源不允许爬取
  • 5.2 ‘User-agent’:该项值用来表示是哪家的搜索引擎
    • ‘allow’:允许被爬取的url
    • ‘disallow’:不允许被爬取的url
  • 5.3 搜索引擎返回的都是网页,并且返回90%的都是无用的数据
  • 5.4 不能够根据不同的用户需求或者检索结果返回不同的结果

第6章 OSI七层协议:

从上往下:
应用层:为用户的应用程序提供网络服务的(http,https,ftp。。。。。)
表示层:负责端到端的数据信息可以被另一个主机所理解和识别,并且按照一定的格式将信息传递到会话层
会话层:管理主机之间的会话进程,负责建立,管理,和终止会话进程
传输层:进行数据传输(TCP UDP)
网络层: 路由器
数据链路层:网桥 交换机
物理层 : 网线 网卡 集线器 中继器

第7章 常见的请求状态码:

200 :请求成功

301 : 永久重定向
302 : 临时重定向

401 : 未授权
403 : 服务器拒绝访问
404 : 页面丢失
405 : 请求方式不对
408 : 请求超时

500 : 服务器错误
503 : 服务器不可用

第8章 发起请求:

会携带请求头

  • ’USer-Agent‘:模拟浏览器请求
  • ‘Cookies’:存储在浏览器里,使用cookie表明身份
  • ‘Refere’:说明当前请求是从哪个页面发起

第9章 使用urllib发起请求:

#目标url
url = 'http://www.baidu.com/'

# request.urlopen():使用urlopen方法模拟浏览器发起请求
"""
url, 请求的目标url地址
data=None,默认情况为None,表示发起的是一个get请求,不为None,则发起的是一个post请求
timeout=,设置请求的超时时间 
cafile=None, 设置证书
capath=None, 设置证书路径
cadefault=False, 是否要使用默认证书(默认为False)
context=None:是一个ssl值,表示忽略ssl认证
"""

#是一个ssl值,表示忽略ssl认证(如果请求出现了ssl证书认证错误,
# 我们就需要设置ssl._create_unverified_context(),忽略证书认证)
content = ssl._create_unverified_context()
response = request.urlopen(url,timeout=10,content=content)
#从response响应结果中获取参数
#状态码
code = response.status
print(code)
#获取页面源码的二进制数据
b_html = response.read()
print(type(b_html),len(b_html))
#获取响应的响应头部(Response Headers)
res_headers = response.getheaders()
print(res_headers)
#获取响应头中指定参数的值
cookie_data = response.getheader('Set-Cookie')
print(cookie_data)
#reason返回一个响应结果的原因
reason = response.reason
print(reason)

#将获取到的二进制数据,转换为字符串decode
str_html = b_html.decode('utf-8')
print(type(str_html))

with open('b_baidu.page.html','w') as file:
    # file.write(b_html)
    file.write(str_html)


#如果请求要携带请求头

#需要先构建一个request对象
"""
url:发起请求的url地址
data=None, 默认情况为None,表示发起的是一个get请求,不为None,则发起的是一个post请求
headers={},设置请求头(headers对应的数据类型是一个字典)
origin_req_host=None, (指定发起请求的域)
unverifiable=False,忽略SSL认证
method=None:指定发起请求的方式
"""
req_header = {
   
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
req = request.Request(url,headers=req_header)

#根据构建的req请求对象发起请求
response = request.urlopen(req)
response.status

第10章 正则表达式:

. :表示匹配除了换行符之外的任意字符
\ :转义字符
[a-z] : 匹配a-z里面的任意一个字符
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'

\d: 匹配数字 -> [0-9]
\D: 匹配非数字 [^\d]
\s: 匹配空白字符(空格,\n,\t...)
\S: 匹配非空白字符 
\w: 匹配单词字符 [A-Za-z0-9_]
\W: 匹配非单子字符


^:匹配以...开头
$:匹配以....结尾

():分组
|:'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc
  • 39
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值