通过编写程序,模拟浏览器上网,然后让其去互联网抓取数据的过程.
爬虫的价值:
抓取页面
爬虫在使用场景中的分类:
爬虫中的矛与盾
反爬机制
门户网站,可以通过制定相关策略或者技术手段,防止爬虫程序进行网站数据的爬取。
反反爬策略
爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获得门户网站信息。
robots.txt协议
君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取。
df
df1
##
http协议
概念 就是服务器和客户端进行数据交互的一种形式。
常用请求头信息
User-Agent:请求载体的身份表示
Connection:请求完毕后,是断开连接还是保持连接
常用响应头信息
Content-Type:服务器响应回客户端的数据类型
https协议:
- 安全的超文本传输协议
加密方式
对称秘钥加密
非对称秘钥加密
证书秘钥加密
requests模块
urllib模块
requests模块
requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发出请求。
如何使用:
制定url
发起请求
获取响应数据
持久化存储
环境安装:pip install requests
实战编码:
需求:爬取搜狗首页的页面数据 搜狗
import requests if __name__ == "__main__": #step 1: 指定url url = 'https://www.sogou.com/' #step 2: 发起请求 response = requests.get(url=url) #step 3: 获取响应的数据 text返回的是字符串形式的响应数据 page_text = response.text #step 4: 持久化存储 with open('./sogou.html','w',encoding='utf-8') as fp: fp.write(page_text) print('爬取数据结束!!!')
需求:爬取搜狗指定词条对应的搜索结构页面(建议网页采集器)
需求:破解百度翻译
需求:爬取肯德基
#UA伪装 # UA: User-Agent (请求载体的身份标识) # 门户网站的服务器会检测对应请求的载体身份标识,若检测到请求的载体身份标识为一款浏览器 # 则说明该请求是一个正常的请求,服务器不会拒绝这个请求;如果,检测到请求的载体身份标识不是基于某一款浏览器的 # 则标识该请求为不正常的请求(爬虫),则服务器端就可能拒绝该请求。 #UA伪装 import requests if __name__ == "__main__": #UA伪装:将对应的User-Agent封装到一个字典中 headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel _12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' } url = 'https://www.sogou.com/web' # 处理url携带的参数:封装到字典中 kw = input('enter a word:') param = { 'query':kw } # 对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数 response = requests.get(url=url,params=param,headers=headers) page_text = response.text fileName = kw+'.html' with open('fileName','w',encoding='utf-8') as fp: fp.write(page_text) print(fileName,'保存成功!!!')
import json import requests if __name__ == "__main__": # 1.指定url post_url = 'https://fanyi.baidu.com/sug' # 2. 进行UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36' } # 3.post 请求参数处理(同get请求一致) word = input('enter a world:') data = { 'kw':word } #kw就是表单数据的参数,不一致是不行的 # 4.请求发送 response =requests.post(url=post_url,data=data,headers=headers) #5.获取响应数据:json()方法返回的是obj(如果确定响应数据是json类型的,才可以使用json() ) # application/json 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')
import requests import json if __name__ == "__main__": url = 'https://movie.douban.com/typerank' param = { 'type': '24', 'interval_id': '100:90', 'action':'', 'start': '1', #从库中的第几部电影去取 'limit': '20',#一次取出的个数 } headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36' } response = requests.get(url=url,params=param,headers=headers) list_data = response.json() fp = open('./douban.json','w',encodings='utf-8') json.dump(list_data,fp=fp,ensure_ascii=False) print('over!!!')
详情页信息也是动态加载出来的
http://scxk.nmpa.gov.cn:81/xk/
聚焦爬虫
编码流程
指定url
发起请求
获取响应数据
数据解析
持久化存储
出具解析分类
正则
bs4
xpath (***)
出具解析原理概述
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
进行指定标签的定位
标签或者标签对应的属性中存储的数据进行提取(解析)
正则表达式
正则表达式:https://github.com/ziishaned/learn-regex/tree/master/translations
正则表达式github
import requests if __name__ == "__main__": #如何爬取图片数据 url = 'https://myxpz.oss-cn-beijing.aliyuncs.com/img/202205161635519.png' #content返回的是二进制形式的图片数据 #text(字符串) content(二进制)json()(对象) image_data = requests.get(url=url).content with open('./tupian.jpg','wb') as fp: fp.write(image_data)
bs4进行数据解析
数据解析的原理
标签定位
提取标签,标签属性中存储的数据值
bs4数据解析的原理
bs4进行数据解析 一数据解析的原理: 一1.标签定位 一2.提取标签、标签属性中存储的数据值 一bs4数据解析的原理: 1.实例化一个BeautifutSoup对象,并且将页面源码数据加载到该对象中 一2.通过调用Beaut主fulSoup对象中相关的属性或者方法进行标签定位和数据提取 一环境安装: pip installbs4 pipinstalllxml 如何实例化BeautifutSoup对象: frombs4importBeautifuISoup
一对象的实例化:
一1.将本地的html文档中的数据加载到该对象中 open(./test.html' 《r《utf—8') BeautifuISoup(fp,《《) soup 一2.将互联网上获取的页面源码加载到该对象中 page_text response.text @eatifuNSoup(page_text,《lxml《) soup 一提供的用于数据解析的方法和属性:
提供的用于数据解析的方法和属性:
-soup.tagName:返回的是文档中第一个出现的tagName对应的标签
-soup.find():
import requests from bs4 import BeautifulSoup if __name__ =="__main__": headers = { 'user - agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 101.0.4951.54 Safari / 537.36' } url = 'https://www.shicimingju.com/book/sanguoyanyi.html' page_text = requests.get(url=url,headers=headers).content #在首页中解析出章节的标题和详情页的url #1.实例化BeautifulSoup对象,需要将页面源码数据加载该对象中 soup = BeautifulSoup(page_text,'lxml') # 获取章节标题 li_list = soup.select('.book-mulu > ul > li') fp = open('./sanguo.txt', 'w', encoding='utf-8') for li in li_list: title = li.a.string detail_url = 'https://www.shicimingju.com'+li.a['href'] #对详情页发起请求,解析出章节内容 # 乱码的这样: resopnse_text = resopnse.text.encode(resopnse.encoding).decode("utf-8") detail_page_text = requests.get(url=detail_url,headers=headers).text # 解析出详情页相关的章节内容 detail_soup = BeautifulSoup(detail_page_text,'lxml') div_tag = detail_soup.find('div',class_='chapter_content') #解析到章节内容 content = div_tag.text fp.write(title+':'+content+"\n") print(title,'爬取成功')
乱码不用.text改用。content
xpath解析原理:
实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
-pip install lxml
如何实例化一个etree对象
将本地的html文档中的源码数据加载到etree对象中:
etree.parse(filePath)
2.可以将雄互联网上获取的源码数据加载到该对象中
etree.html('page_text')
xpath表达式:
/:表示的是从根节点开始定位。表示的是一个层级。
//:表示的是多个层级。可以表示从任意位置空时定位。
属性定位://div[@class='song'] tag[@attrName="attrValue"]
索引定位://div[@class="song"]/p[3] 索引是从1开始的。
取文本 :
取属性:
百度
百度一下
文件:alt+F
编辑:alt+E
段落:alt+P
格式:alt+O
视图:alt+V
主题:alt+T
帮助:alt+H
新建:Ctrl+N
新建窗口:Ctrl+Shift+N
打开:Ctrl+O
快速打开:Ctrl+P
保存:Ctrl+S
另存为:Ctrl+Shift+S
偏好:Ctrl+,
关闭:Ctrl+W
撤销:Ctrl+Z
重做:Ctrl+Y
剪切:Ctrl+X
复制:Ctrl+C
粘贴:Ctrl+V
复制为MarkDown:Ctrl+Shift+C
粘贴为纯文本:Ctrl+Shift+V
全选:Ctrl+A
选中当前行/句:Ctrl+L
选中当前格式文本:Ctrl+E
选中当前词:Ctrl+D
跳转到文首:Ctrl+Home
跳转到所选内容:Ctrl+J
跳转到文末:Ctrl+End
查找:Ctrl+F
查找下一个:F3
查找上一个:Shift+F3
替换:Ctrl+H
标题:Ctrl+1/2/3/4/5
段落:Ctrl+0
增大标题级别:Ctrl+=
减少标题级别:Ctrl±
表格:Ctrl+T
代码块:Ctrl+Shift+K
公式块:Ctrl+Shift+M
引用:Ctrl+Shift+Q
有序列表:Ctrl+Shift+[
无序列表:Ctrl+Shift+]
增加缩进:Ctrl+]
减少缩进:Ctrl+[
加粗:Ctrl+B
斜体:Ctrl+I
下划线:Ctrl+U
代码:Ctrl+Shift+`
删除线:Alt+Shift+5
超链接:Ctrl+K
图像:Ctrl+Shift+I
清除样式:Ctrl+
显示隐藏侧边栏:Ctrl+Shift+L
大纲视图:Ctrl+Shift+1
文档列表视图:Ctrl+Shift+2
文件树视图:Ctrl+Shift+3
源代码模式:Ctrl+/
专注模式:F8
打字机模式:F9
切换全屏:F11
实际大小:Ctrl+Shift+0
放大:Ctrl+Shift+=
缩小:Ctrl+Shift±
应用内窗口切换:Ctrl+Tab
打开DevTools:Shift+F12