爬虫:请求网站并提取数据的自动化程序。 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
目录
爬虫的分类
Robots协议
常用请求头/响应头、http/s、加密方式
urllib 模块 (比较繁琐)
urllib.request.urlopen()基本使用
requests模块 (简单便捷,接下来都是使用的requests模块)
如何使用:
爬取搜狗首页
Day1
requests巩固案例
破解百度翻译
Json
爬取豆瓣电影分类排行榜
Ajax(阿贾克斯)
Day2
数据解析
图片爬取
正则解析
bs4解析
如何实例化BeautifulSoup对象:
提供的用于数据解析的方法和属性:
获取标签之间的文本数据:
获取标签中属性值:
bs4解析案例
xpath解析(便捷高效、通用)
如何实例化一个etree对象:
xpath表达式:
xpath解析案例之二手房源
xpath解析之图片解析
Day3
验证码识别
Day4
异步爬虫
爬虫的分类
根据使用场景,爬虫可以分为三类:
1.通用爬虫(大而全)
功能强大,采集面广泛,通常用于搜索引擎,比如百度浏览器就是一个很大的爬虫程序。
2.聚焦爬虫(小而精)
建立在通用爬虫的基础上,抓取页面中特定的局部内容,比如说去某个网站批量获取某些数据。
3.增量式爬虫(只采集更新后的内容)
这其实是聚焦爬虫的一个迭代爬虫,检测网站中数据更新情况,只会抓取网站中最新更新的数据。
Robots协议爬虫中有一个Robots协议,又称为“网络爬虫排除标准”,君子协议,规定了网站中哪些数据可以被爬虫爬取,哪些不可被爬取。一般情况下直接在网站首页网址后面加/robots.txt就能查看,比如百度的Robots协议就在https://www.baidu.com/robots.txt 。
常用请求头/响应头、http/s、加密方式http协议:就是服务器和客户端进行数据交互的一种形式
https协议:安全的超文本传输协议,采用证书密钥加密
常用请求头:User-Agent(请求载体的身份标识)
Connection(请求完毕后,是断开连接还是保持连接)
常用响应头:Content-Type(服务器响应回客户端的数据类型)
加密方式:1.对称密钥加密:客户端将要传输到服务器的参数加密,传输时携带密钥
2.非对称密钥加密:服务端创建密钥对,将公钥发给客户端,客户端使用密钥对消息加
密,将加密信息发给服务端,服务端再用私钥解密。
3.证书密钥加密:公开密钥-->证书认证机构-->给公钥签名(防伪)-->证书
urllib 模块 (比较繁琐)urllib中包括了四个模块:urllib.request,urllib.error,urllib.parse,urllib.robotparser
urllib.request可以用来发送请求request和获取请求request的结果
urllib.error包含了urllib.request产生的异常
urllib.parse用来解析和处理URL
urllib.robotparse用来解析页面的robots.txt文件
urllib.request.urlopen()基本使用urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。
import urllib.request #导入模块 reaponse=urllib.request.urlopen("URL") #获取网页内容 html=reaponse.read() #读取网页内容,放到html print(html) #内容以b开头,打印出来是二进制的数据 html2=html.decode('utf-8') #解码 print(html2)requests模块 (简单便捷,接下来都是使用的requests模块)
requests模块:python中原生的一款基于网络请求到模块,功能强大,简单便捷,效率极高
作用:模拟浏览器发请求
如何使用:1.指定url 2.发起请求 3.获取响应数据 4.持久化存储
爬取搜狗首页#爬取搜狗首页 import requests # 1.指定url url='https://www.sogou.com/' # 2.发起请求,get方法会返回一个响应对象 response=requests.get(url=url) # 3.获取响应数据 .text返回的是字符串形式的响应数据 page_text=response.text print(page_text) # 4.持久化存储 with open('./sogou.html','w',encoding='utf-8') as fp: fp.write(page_text) print('爬取数据结束')Day1 requests巩固案例
User-Agent:请求载体的身份标识
UA伪装:如果门户网站的服务器会检测对于请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器。
注:说明该请求是一个正常请求,但是如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常请求(爬虫),则服务器端很可能拒绝该次请求,所以在爬虫中进行UA伪装。
破解百度翻译post请求(携带了参数),响应数据是一组json数据
import json import requests #1.指定url post_url='https://fanyi.baidu.com/sug' #2.进行UA伪装 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0'} #3.post请求参数处理(同get请求一致) word=input('输入一个单词:') data={'kw':word} #4.请求发送 response=requests.post(url=post_url,data=data,headers=headers) #5.获取响应数据 response.text #获取到字符串类型数据 dic_obj=response.json() #json()方法返回的是一个字典的对象obj(如果确定响应数据是json类型,才可以使用json()) #6.持久化存储 filename=word+'.json' fp=open(filename,'w',encoding='utf-8') json.dump(dic_obj,fp=fp,ensure_ascii=False) #(对象,文件,中文) print('over!!!!!!!')Json
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换 [5] 。同时也易于机器解析和生成。
JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。
JSON是一个序列化的对象或数组。
json.dump() 是把python对象转换成json对象生成一个fp的文件流,和文件相关。ensure_ascii=True:默认输出ASCLL码,如果把这个该成False,就可以输出中文。
Json语法: JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在名称/值对中
- 数据由逗号 , 分隔
- 使用斜杆来转义 \ 字符
- 大括号 {} 保存对象
- 中括号 [] 保存数组,数组可以包含多个对象
Json对象:
JSON 对象在大括号 { } 中书写:
{key1 : value1, key2 : value2, ... keyN : valueN }
Json数组:
JSON 数组在中括号 [ ] 中书写:(数组可以包含多个对象)
[ { key1 : value1-1 , key2:value1-2 }, { key1 : value2-1 , key2:value2-2 }, { key1 : value3-1 , key2:value3-2 }, ... { key1 : valueN-1 , key2:valueN-2 }, ]
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
如
var obj={a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹
var json='{"a": "Hello", "b": "World"}'; //这是一个JSON字符串,本质是一个字符串
要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}
要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}''
爬取豆瓣电影分类排行榜
滑动滚轮,当滑到底部会加载一组新的电影数据,地址栏(url)没变是做的一个页面的局部刷新,是发起了Ajax(阿贾克斯)请求
import json import requests 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; rv:102.0) Gecko/20100101 Firefox/102.0'} response=requests.get(url=url,params=param,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!!!!!')Ajax(阿贾克斯)
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
AJAX 通过在后台与服务器进行少量数据交换,使网页实现异步更新。这意味着可以在不重载整个页面的情况下,对网页的某些部分进行更新。
数据解析原理:解析的局部的内容都会在标签之间或者标签对应的属性中进行存储
1.进行指定标签的定位
2.标签或者标签对应的属性中存储的数据值进行提取(解析)
聚焦爬虫,是爬取页面中指定的页面内容。首先爬整张页面内容,再将指定内容提取出来,提取过程就叫数据解析。
编码流程:1.指定url
2.发起请求
3.获取响应数据
4.数据解析
5.持久化存储
数据解析分类:正则、bs4、xpath
图片爬取import requests url='https://wx1.sinaimg.cn/orj360/001DQGfkgy1h46mjn19khj61o02yo1ky02.jpg' #content返回的是二进制的图片数据 # text (字符串) content (二进制) json() (对象) img_data=requests.get(url=url).content with open('./tupian.jpg','wb') as fp: # w以写方式打开文件,b以二进制方式打开文件(不能单独使用, 以wb或者rb组合使用) fp.write(img_data)正则解析
import re import requests import os #创建一个文件夹,保存所有图片 if not os.path.exists('./tupian'): os.mkdir('./tupian') url='https://tieba.baidu.com/f' header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0'} #使用通用爬虫,对整张页面进行爬取 page_text=requests.get(url=url,headers=header).text #使用聚焦爬虫对页面中所有图片进行提取(解析) ex='
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录