爬虫基础
时间:2023-06-30 12:37:00
爬虫的概念
概念:(spider,网络蜘蛛)通过互联网上的网络节点提取、集成和存储数据
分类:
通用爬虫(理解)
主要用于搜索引擎(百度,Google ,搜狗等)
搜索引擎的工作原理:
核心部分:根据互联网的拓扑结构,通过爬虫分批抓取数据,然后清理整合数据,然后按一定顺序存储在百度数据库集群中
检索部分:本质上是一个web该系统为用户提供检索平台
搜索引擎获取数据的方式:
一、通用爬虫
2)主动提交自己的网站
3)通过竞价排名(信息排名:1、流量 2、竞价)
4)搜索引擎和DNS运营商合并了一些有价值的网站
robots协议:
robots协议不是技术协议,而是绅士协议;第一步是访问网站robots.txt文件规定了这些东西不能爬,爬虫应该严格遵守,只爬允许的内容,不爬不允许的内容,搜索引擎爬虫必须遵守robots协议;我们写的话不能遵守。
聚焦爬虫
工作原理:
1.数据提取(抓取)
技术:http协议等应用层协议
反爬:用户代理,IP禁止、验证码、会话处理等
2、数据的分析
遇到的数据:html、json、xml、js数据
反爬:js动态加载、js加密、后台加密等
数据存储
CSV数据、json数据、关系型数据库、非关系型数据库
如何应对反爬虫?
学习内容:
1、python
2.相关框架
urllib、requests、scripy抓取等数据
正则、xpath、bs4、selenium等
3.分布式部署
2、HTTP协议
1、什么是HTTP协议?
1)是基于请求和响应的应用层协议,底层协议是TCP保证了整个传输过程的可靠性
2)通过url客户端与服务器交互(url解释:统一资源定位符,用于定位互联网上资源的位置、格式和协议://主机名称.域名:端口号/路径名:…?参数1=值1&参数2=值2&…#锚点)
3)是一种C/S(B/S是一种特殊的C/S协议结构)模式、客户端发起请求、服务端处理请求和响应
4)通过无状态协议是一种无状态协议cookie或者session处理会话信息
2、http的过程
1)创建TCP链接:三次握手,客户端首先要求服务器是否同意创建连接,然后服务根据自己的任务量决定是否创建,是否创建连接相关信号返回客户端,然后如果客户端同意创建连接信号,正式启动创建连接信号,并带来http协议的报文。通过在客户端和服务器之间建立三次握手的数据通路,可以保证HTTP协议的可靠传输
2)客户端向服务器启动HTTP请求:通过url将参数和请求头信息传递给服务器有4种常见的请求方式,常用的是get和post
请求头:包含本请求的相关配置信息(如:主机、cookie、数据格式等。)决定了客户端和服务之间的数据通信方式和格式
请求体即参数,即客户端希望服务器提交的数据
get请求和post请求差异:
get请求参数拼接在url后面的,post请求参数不体现在url(一般通过表单直接提交);get请求数据量有限(不同的浏览器对url长度有不同的限制),post请求没有限制
3)服务器处理请求并响应数据
4)判断数据传输是否结束,如果结束,四次挥手断开TCP链接
3、工具
windows、Linux、fiddler
urlib模块
- urllib是python为启动提供一个http相关业务和请求的处理url后期爬虫的一些框架是基于工具的urllib
- request是urllib中请求工具
方法
# 1、urlopen(),打开远程链接并发起请求,然后返回响应对象 url = "http://www.baidu.com/" res = request.urlopen(url=url) print(res) # 响应对象 # print(res.headers) # 输出响应头 # 读取响应体 print(res.read()) # 默认读取的是二进制 print(res.read().decode("utf-8")) # read函数是迭代读取,第二次读取是从第一次开始 # 2、urlretrieve(url,filename),对url发起请求,并将响应体写入filename在相应的文件中 r = request.urlretrieve(url=url,filename="./baidu.html") print(r) #('./baidu.html', ) request.urlretrieve(url="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1563170159325&di=9a44a383d70207bd3aa08a4a639e1bbd&imgtype=jpg&src=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D1802778634%2C700132782%26fm%3D214%26gp%3D0.jpg",filename="./hello.jpg")
# 3、urlencode(),对url进行编码
url = "https://www.baidu.com/s?"
# "ie=utf-8&wd=hello"
# 对于urllib不能直接接收非ascii码字符,我们需要将其转成ascii码格式
from urllib.parse import urlencode
# parse模块用于处理url格式
# 创建一个字典
dic = {
"ie":"utf-8","wd":"老王"}
# 用urlencode方法来将字典处理成http参数的形式(参数1=值1&参数2=值2&.....)
params = urlencode(dic)
print(params)
res = request.urlopen(url=url+params)
print(res)
# request.urlopen(url="https://weibo.cn/pub/") # 直接访问是非法访问就会被拒绝
-
解决https访问被拒绝
- 反爬:用户代理
- 用户代理:后台可以通过检测前端提交的请求头中的user-agent这个请求头,从他的值中得出当前正在访问的终端是什么,然后根据当前终端的版本信息决定应该影响什么样的内容。如果检测不到user-agent,或者检测到的user-agent和系统中任何一种user-agent都不匹配,那么就会拒绝访问。
-
添加用户代理等请求头信息来伪装浏览器
# 创建Request对象
req = request.Request(url="https://weibo.cn/",headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'cookie': '_T_WM=39ad9b2cdf11c160cd106f434ec5b03f; SUB=_2A25wL4UqDeRhGeBN7FIR9izJyTSIHXVT0ytirDV6PUJbkdAKLW_fkW1NRFYvP5x_aUas_YRuoCOKxITLjrTEO_vf; SUHB=0WGsVQsvKVLjCH; SCF=AjI0Hr3RTGBbFpCKBVczLVDI3kRMZS13v6nRl4A1AUtFqpi5S7rHssl8CQYL1GRV6zHalH_SSD7ziihqrBfFnC4.; SSOLoginState=1563161978'
})
# 用携带请求头的请求对象发起请求
res = request.urlopen(req)
print(res)
# print(res.read().decode("utf-8"))
with open("./weibo.html","wb") as fp:
fp.write(res.read())
完整爬虫过程
-
请求网页
-
解析网页
-
存储
from urllib import request
import re
from time import sleep
import csv
# 【下载模块】
# 定义一个函数,用于将url处理成请求对象
def request_from(url,page):
# 拼接url
page_url = url + str(page) + "/"
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
return request.Request(url=page_url,headers=headers)
# 封装一个函数,用于发起请求
def request_data(url,start,end):
"这个函数用于将有start页到end页的url处理成响应字符串,然后放在容器中返回"
# l = []
# 对start到end进行遍历
for page in range(start,end+1):
# 创建请求对象
req = request_from(url=url,page=page)
# 发起请求
res = request.urlopen(req)
# 每请求一次要让程序中断1s,主要为了防止后台误认为当前程序是爬虫
print("当期正在请求第%d页..."%page)
sleep(1)
# l.append(res.read().decode("utf-8"))
yield res.read().decode("utf-8")
# yield可以将一个函数变成一个生成器,生成器中内容就是每一次yield后面的内容
# return l
# 【解析模块】
def analysis_data(data):
"这个函数,传入待解析的那些html字符串,输出解析完的格式化的内容"
for html in data:
# 解析html字符串
pat = re.compile(r',re.S)
qiu_list = pat.findall(html)
# 遍历所有的糗事
for qiushi in qiu_list:
# 提取每一个糗事中的内容
# 创建一个字典用于整合每一个糗事的相关内容
item = {
}
# 作者姓名
pat_author = re.compile(r'(.*?)
', re.S)
item["author"] = pat_author.findall(qiushi)[0]
# 内容
pat_content = re.compile(r'.*(.*?)',re.S)
item["content"] = pat_content.findall(qiushi)[0]
# 糗图: 把图片本身存入本地的路径上,在item里面要体现出图片的url和存储路径
# 找到图片的url路径
pat_pic = re.compile(r'.*?
,re.S)
pic_url = "https:"+pat_pic.findall(qiushi)[0]
# print(pic_url)
# 从url中切分出图片的名字
pic_name = pic_url.split("/")[-1]
# 拼接出图片的存储路径
pic_path = "./qiutu/" + pic_name
# 下载图片
request.urlretrieve(url=pic_url,filename=pic_path)
print("正在下载图片:",pic_path)
sleep(0.5)
item["pic"] = {
"filename":pic_path,"url":pic_url}
yield item
# 【存储模块】
# json数据,csv二维表,redis数据库,mysql数据库
# 存二维表
def write_to_csv(data):
# 打开csv文件
csvfile = open("./qiubai.csv","a+",encoding="utf-8",newline='') # 以追加的方式打开csv文件
# 此处容易发生bug,注意编码格式和换行方式
# 根据打开的csv文件创建写对象
writer = csv.writer(csvfile)
# 写表头
writer.writerow(["author","content","pic_url","pic_path"]) # 这个函数用于写一行
# 将data中存储的内容写入到二维表中
for item in data:
# csv表中每一行就是编程语言中的一个一维列表,所以在这里我们需要将item这个字典转化成列表
# 创建一个空列表
row = []
row.append(item["author"])
row.append(item["content"])
row.append(item["pic"]["url"])
row.append(item["pic"]["filename"])
# 将row列表写入到csv中
writer.writerow(row)
if __name__ == '__main__':
url = "https://www.qiushibaike.com/pic/page/"
# 请求网页
content_list = request_data(url=url,start=1,end=35)
print(content_list)#
# 解析
list = analysis_data(content_list)
# 存储
write_to_csv(list)
相关文章
动力学技术KTU1121 USB Type-C 端口保护器的介绍、特性、及应用
Sensata PTE7300密封数字压力传感器的介绍、特性、及应用
PANJIT PBHV8110DA/PBHV9110DA低Vce(sat)晶体管的介绍、特性、及应用
ams OSRAM OSLON 黑色平板X LED器件的介绍、特性、及应用
Cree LED CLQ6A三合一贴片LED的介绍、特性、及应用
Cree LED CLQ6B 4-in-1 RGBW贴片LED的介绍、特性、及应用
NDK NX1210AB表面贴装晶体的介绍、特性、及应用
伊顿ACE2V3225共模芯片电感器的介绍、特性、及应用
意法半导体X040灵敏型栅可控硅和Z040可控硅的介绍、特性、及应用
ABLIC S-82Y1B电池保护芯片的介绍、特性、及应用