网课知识点汇总
爬虫简介
什么是爬虫:通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
风险:1、需要时常优化程序,避免干扰被访问网站的正常运行;2、在使用或传播爬取到的数据时,审查抓取到的内容,如果发现涉及到用户隐私、商业机密等敏感内容,需要及时停止
通用爬虫
抓取系统的重要组成部分。抓取的是一整张页面数据。
聚焦爬虫
建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。例:某条微博下的评论、豆瓣电影排行榜中评分高于9的电影
增量式爬虫
检测网站中数据更新的情况。只会抓取网站中更新出来的数据。
反爬机制
门户网站可以制定相应的策略或技术手段,防止爬虫程序进行网站数据的爬取
反反爬策略
爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而获取数据
robots.txt协议
规定网站中哪些数据可以被爬取,哪些不可以被爬取,需要承担责任。
http协议
概念:服务器和客户端进行数据交互的一种形式。
常用请求头信息
User-Agent:请求载体的身份标识
Connection:请求完毕后,是断开连接还是保持连接
常用响应头信息
Content-Type:服务器响应回客户端的数据类型
https协议
安全的超文本传输协议,涉及数据加密
加密方式
1、对称密钥加密:客户端将钥匙和锁一起发给服务器。如果请求被拦截会有安全隐患。
2、非对称密钥加密:使用的时候有两把锁,一把叫做私有密钥,一把是公开密钥,服务器首先告诉客户端按照自己给定的公开密钥进行加密处理,客户端按照公开密钥加密以后,服务器接收到信息再通过自己的私有密钥进行解密,好处是解密的钥匙不会进行传输,避免被挟持。缺点是效率低、公开密钥可能被篡改。
3、证书密钥加密:https采用的。服务器的开发者携带公开密钥,向数字证书认证机构提出公开密钥的申请,数字证书认证机构审核申请者的身份,审核通过以后,会对开发者申请的公开密钥做数字签名,分配这个已签名的公开密钥,并将密钥放在证书里面,绑定在一起。服务器将这份数字证书发送给客户端,因为客户端也认可证书机构,客户端可以通过数字证书中的数字签名来验证公钥的真伪,确保服务器传过来的公开密钥是真实的,一般情况下,证书的数字签名是很难被伪造的,这取决于认证机构的公信力。一旦确认信息无误之后,客户端就会通过公钥对报文进行加密发送,服务器接收到以后用自己的私钥进行解密。
requests模块
urllib模块:比较古早,爬虫繁琐,被替代了,课程中不介绍
requests模块:Python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。作用是模拟浏览器发请求
如何使用(requests模块的编码流程):指定url(网址)→发起请求(录入网址回车)→获取响应数据(显示网页)→持久化存储(存储数据)
环境安装:pip install requests(可用import requests检查,没反应说明已安装过)
例子1:爬取搜狗首页的页面数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import requests
url = 'https://www.sogou.com/'
response = requests.get(url = url)
page_text = response.text print(page_text)
with open('./sogou.html','w',encoding = 'utf-8') as fp: fp.write(page_text) print('爬取数据结束')
|
例子2:爬取搜狗指定词条对应的搜索结果页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
import requests
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0' }
url = 'https://www.sogou.com/web'
Keyword = input('enter a word:') param = { 'query':Keyword }
response = requests.get(url = url,params = param,headers = headers)
page_text = response.text
fileName = Keyword + '.html' with open(fileName,'w',encoding = 'utf-8') as fp: fp.write(page_text) print(fileName,'保存成功')
|
例子3:破解百度翻译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
import requests import json
post_url = 'https://fanyi.baidu.com/sug'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0' }
word = input('enter a word:') data = { 'kw':word }
response = requests.post(url = post_url,data = data,headers = headers)
dic_obj = response.json() print(dic_obj)
fileName = word + '.json' fp = open(fileName,'w',encoding = 'utf-8') json.dump(dic_obj,fp = fp,ensure_ascii = False) print('over')
|
例子4:爬取豆瓣电影分类排行榜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import requests import json
url = 'https://movie.douban.com/j/chart/top_list'
param = { 'type': '24', 'interval_id': '100:90', 'action': '', 'start': '0', 'limit': '20', }
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0' }
response = requests.post(url = url,data = data,headers = headers)
list_data = response.json()
fp = open('./douban.json','w',encoding = 'utf-8') json.dump(list_data,fp = fp,ensure_ascii = False) print('over') fp.close()
|
例子5:爬取肯德基餐厅查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import requests
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
data = { 'cname':'', 'pid':'', 'keyword':'北京', 'pageIndex':'1', 'pageSize':'10', }
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0' }
response = requests.post(url = url,data = data,headers = headers)
page_text = response.text
with open('./kfc.html','w',encoding = 'utf-8') as fp: fp.write(page_text) print('over')
|
例子6:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
1 2 3 4 5 6 7 8 9 10 11
| id_list = []
json_ids = requests.post(url = url,data = data,headers = headers).json() for dic in json_ids['list']: id_list.append(dic['ID'])
for id in id_list: data = { 'id':id }
|
数据解析
数据解析原理
解析的局部文本内容都会在标签之间或标签对应的属性中进行存储,用于聚焦爬虫,步骤位于获取响应数据后
1、进行指定标签的定位
2、提取(解析)标签或者标签对应属性中存储的数据值
数据解析分类
正则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
""" 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d : 数字[0-9] \D : 非数字 \w : 数字、字母、下划线、中文 \W : 非\w \s:所有的空白字符,包括空格、制表符、换页符等,等价于[\f \n \r \t \v] \S : 非空白 数量修饰: * : 任意多次 >=0 + : 至少一次 >=1 ? : 可有可无 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次 {m,n} :m-n次 边界: $ :以某某结尾 ^ : 以某某开头 分组: (ab) 贪婪模式 :.* 非贪婪(惰性)模式 :.*? #匹配最短的 re.I : 忽略大小写 re.M : 多行匹配 re.S : 单行匹配 re.sub(正则表达式,替换内容,字符串) """
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import re
key = "javapythonc++php" re.findall('python',key)[0]
key = "<html><h1>hello world<h1></html>" re.findall('<h1>(.*)<h1>',key)[0]
string = '我喜欢身高为170的女孩' re.findall('\\d+',string)
key = 'http://www.baidu.com and https://boob.com' re.findall('https?://',key)
key = 'lalala<hTml>hello</HtMl>hahah' re.finda1l('<[Hh][Tt][mM][lL]>(.*)</[Hh][Tt][mM][1L]>',key)
key = 'bobo@hit.edu.com' re.findall('h.*?\\.',key)
key = 'saas and sas and saaas' re.findall('sa{1,2}s',key)
|
1 2 3 4 5 6 7 8
| import requests url = 'https://pics5.baidu.com/feed/a686c9177f3e670943b8a40d0391b83af9dc5561.jpeg@f_auto?token=ac1a9f005bed735ea8b915db9e8a6f46&s=FD3616D09E0B6A47430B19C10300E098'
img_data = requests.get(url = url).content with open('./picture.jpg','wb') as fp: fp.write(img_data)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import requests import re
url = 'https://baijiahao.baidu.com/s?id=1675547469620726703&wfr=spider&for=pc'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0'
page_text = requests.get(url = url,headers = headers).text
pattern = r'<img[^>]*>'
img_tags = re.findall(pattern, page_text,re.S) for img in img_tags: print(img)
|
bs4
xpath(重点)