爬虫初识
爬虫介绍
爬虫(spider)又称网络蜘蛛
爬虫的本质
目前所有的软件的原理都是基于http请求发送和获取数据的,如PC端的网页,移动端的app
爬虫可以模拟发送http请求,从别人的服务端获取数据。对于不同的程序,都会有不同的反扒措施。
爬虫原理
模拟发送http请求【requests,selenium】发送给第三方服务端,服务端响应的数据解析出想要的数据【selenium,bs4】,解析过后,进行入库操作(文件,mysql,redis,mongodb,excel……)
爬虫的专业框架
scrapy
查看爬虫是否合法
每个网站都要准许爬虫协议
每个网站根路径下都有robots.txt,这个文件规定了,该网站,哪些可以爬取,哪些不能爬
事例
百度就是一个大的爬虫
-百度搜索框中输入搜索内容,回车,返回的数据,是百度数据库中的数据
-百度一刻不停的在互联网中爬取各个页面,链接地址--》爬完存到自己的数据库
-当你点击,跳转到真正的地址上去了
-核心:搜索,海量数据中搜索出想要的数据
-seo:免费的搜索,排名靠前
-sem:花钱买关键字
requests模块
使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
安装
使用之前需要先下载requests
第三方模块
pip3 install requests
各种请求方式:常用的就是requests.get()和requests.post()
import requests
r = requests.get('https://api.github.com/events')
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
发送get请求
import requests
res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html')
print(res.text) # http响应体的文本内容
get请求携带参数
地址栏中拼接
import requests
res=requests.get('https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3')
print(res.text) # 获取http响应体中的文本内容
使用params参数携带
import requests
res=requests.get('https://www.baidu.com/s',params={
'wd':'美女',
'name':'刘亦菲'
})
print(res.text)
# https://www.baidu.com/s?wd=美女&name=刘亦菲
url编码和解码
命令 | 意义 |
---|---|
parse.quote() | 将url数据进行编码 |
parse.unquote() | 将url数据进行解码 |
事例:
美女被url编码后--》%E7%BE%8E%E5%A5%B3
from urllib import parse
res=parse.quote('美女')
print(res) # %E7%BE%8E%E5%A5%B3
res=parse.unquote('%E7%BE%8E%E5%A5%B3')
print(res) # 美女
携带请求头
请求头中带数据,有些网站采取了反爬措施,我们可以绕过反爬去获取数据,比如在请求头中带参数,即客户端类型
携带请求头中的参数爬取
import requests
header = {
# User-Agent就是客户端类型,key-value的形式,后面的参数中显示了当前客户端的系统类型,以及使用的浏览器版本
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
res = requests.get('https://dig.chouti.com/', headers=header) # 这个网站做了反爬,请求响应头中的文本数据无法获取,我们在请求头中携带参数就可以获取
print(info.res)
请求头携带的参数referer
-
除了User-Agent,还有referer,它记录了上次访问的地址
例如:
Referer: https://www.lagou.com/gongsi/
-
事例
比如模拟用户登录,当我们向下面这个地址发送请求时,正常应该是在登录的页面上去完成登录,如果我们没有携带referer,那么它就认为你是恶意的请求,拒绝登录
-
事例网址:
https://passport.lagou.com/login/login.html?service=https%3A%2F%2Fwww.lagou.com%2F
referer还可以用于图片防盗链机制,如果referer指向地址的不是我们自己的域名,那就不允许你下载图片
携带cookie
cookie,认证后的cookie,就相当于是登录了
直接放在请求头中
import requests
data = {
'linkId': '36996038'
}
header = {
# 客户端类型
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
# 携带cookie
'Cookie': 'deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiI3MzAyZDQ5Yy1mMmUwLTRkZGItOTZlZi1hZGFmZTkwMDBhMTEiLCJleHBpcmUiOiIxNjYxNjU0MjYwNDk4In0.4Y4LLlAEWzBuPRK2_z7mBqz4Tw5h1WeqibvkBG6GM3I; __snaker__id=ozS67xizRqJGq819; YD00000980905869%3AWM_TID=M%2BzgJgGYDW5FVFVAVQbFGXQ654xCRHj8; _9755xjdesxxd_=32; Hm_lvt_03b2668f8e8699e91d479d62bc7630f1=1666756750,1669172745; gdxidpyhxdE=W7WrUDABQTf1nd8a6mtt5TQ1fz0brhRweB%5CEJfQeiU61%5C1WnXIUkZH%2FrE4GnKkGDX767Jhco%2B7xUMCiiSlj4h%2BRqcaNohAkeHsmj3GCp2%2Fcj4HmXsMVPPGClgf5AbhAiztHgnbAz1Xt%5CIW9DMZ6nLg9QSBQbbeJSBiUGK1RxzomMYSU5%3A1669174630494; YD00000980905869%3AWM_NI=OP403nvDkmWQPgvYedeJvYJTN18%2FWgzQ2wM3g3aA3Xov4UKwq1bx3njEg2pVCcbCfP9dl1RnAZm5b9KL2cYY9eA0DkeJo1zfCWViwVZUm303JyNdJVAEOJ1%2FH%2BJFZxYgMVI%3D; YD00000980905869%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee92bb45a398f8d1b34ab5a88bb7c54e839b8aacc1528bb8ad89d45cb48ae1aac22af0fea7c3b92a8d90fcd1b266b69ca58ed65b94b9babae870a796babac9608eeff8d0d66dba8ffe98d039a5edafa2b254adaafcb6ca7db3efae99b266aa9ba9d3f35e81bdaea4e55cfbbca4d2d1668386a3d6e1338994fe84dc53fbbb8fd1c761a796a1d2f96e81899a8af65e9a8ba3d4b3398aa78285c95e839b81abb4258cf586a7d9749bb983b7cc37e2a3; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjZHVfNTMyMDcwNzg0NjAiLCJleHBpcmUiOiIxNjcxNzY1NzQ3NjczIn0.50e-ROweqV0uSd3-Og9L7eY5sAemPZOK_hRhmAzsQUk; Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1=1669173865'
}
info = requests.post('https://dig.chouti.com/link/vote', data=data, headers=header)
print(info.text)
通过cookie参数
因为cookie很特殊,一般都需要携带,模块把cookie单独抽取成一个参数,是字典类型,以后可以通过参数传入
import requests
data = {
'linkId': '36996038'
}
header = {
# 客户端类型
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
}
res = requests.post('https://dig.chouti.com/link/vote', data=data, headers=header, cookies={'key': 'value'})
print(res.text)
发送post请求
基本的POST请求
# 发送POST请求
import requests
data = {
'username': '[email protected]',
'password': '******',
'captcha': 'cccc',
'remember': '1',
'ref': 'http://www.aa7a.cn/',
'act': 'act_login'
}
res = requests.post('http://www.aa7a.cn/user.php', data=data)
print(res.text)
print(res.cookies) # 响应头中的cookie,如果正常登录,这个cookie就是登录后的cookie RequestsCookieJar:当成字典
# 携带cookie访问首页
res = requests.get('http://www.aa7a.cn/', cookies=info.cookies) # 不携带cookie就是False
print('[email protected]' in res.text) # True
post携带参数
POST请求携带参数,data={} json={}
data={}是使用默认编码格式:urlencoded
json={}是使用编码格式: json
import request
res = requests.post('http://www.aa7a.cn/user.php', json={})
print(res.text)
request.session
使用
request.session的使用,可以当做request使用,但是它可以自动维护cookie
import requests
session = requests.session()
data = {
'username': '[email protected]',
'password': '*******',
'captcha': 'cccc',
'remember': '1',
'ref': 'http://www.aa7a.cn/',
'act': 'act_login'
}
info = session.post('http://www.aa7a.cn/user.php', data=data)
info1 = session.get('http://www.aa7a.cn/')
print('[email protected]' in info1.text) # True
响应Response
response属性
import requests
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 0.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
}
respone = requests.get('https://www.jianshu.com', params={'name': 'wjl', 'age': 66},headers=header)
# respone属性
print(respone.text) # 响应体的文本内容
print(respone.content) # 响应体的二进制内容
print(respone.status_code) # 响应状态码
print(respone.headers) # 响应头
print(respone.cookies) # 响应cookie
print(respone.cookies.get_dict()) # cookieJar对象,获得到真正的字段
print(respone.cookies.items()) # 获得cookie的所有key和value值
print(respone.url) # 请求地址
print(respone.history) # 访问这个地址,可能会重定向,放了它冲定向的地址
print(respone.encoding) # 页面编码
获取二进制数据
# 获取二进制数据,如图片、视频等
import requests
image = requests.get('http://www.aa7a.cn/data/afficheimg/20220913pmsadf.png')
with open('图片.png', 'wb') as f:
f.write(image.content)
# 如果获取的视频数据过大,可能会出现问题,所以对于视频的数据的获取,我们可以分开去拿
MP4 = requests.get(
'https://vd3.bdstatic.com/mda-mk21ctb1n2ke6m6m/sc/cae_h264/1635901956459502309/mda-mk21ctb1n2ke6m6m.mp4')
with open('视频.mp4', 'wb') as f:
for line in MP4.iter_content(): # 迭代的一行一行取数据
f.write(line)
解析解析json
# 解析json格式
res = requests.get(
'https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json')
print(res.text)
print(type(res.text))
print(res.json()['results'][0]['name'])
print(type(res.json()))
标签:http,get,res,爬虫,初识,print,requests,data
From: https://www.cnblogs.com/nirvana001/p/16920169.html