爬虫学习day01
一、爬虫介绍(spider)
"""本质原理"""
现在所有的软件原理大部分都是基于Http请求发送和获取数据的
模拟发送http请求,从别人的服务端获取数据
绕过反扒:不同程序反扒措施不一样,比较复杂
"""爬虫原理"""
发送http请求(requests,selenium)--->第三方服务端--->服务端响应的数据解析出想要的数据(selenium,bs4)--->入库(文件,excel,mysql,mongodb...)
"""专业的爬虫框架"""
scrapy
"""爬出是否合法"""
我们看到的数据才可以爬取下来
我们在做爬虫的时候,需要遵循爬虫协议
"""爬虫协议"""
每个网站根路径下都有robots.txt,这个文件规定了,该网站,哪些可以爬取,哪些不能爬
"""百度:大爬虫"""
百度搜索框中搜索内容,回车,返回的数据,是百度数据库中的数据
百度一刻不停的在互联网中爬取各个页面,链接地址--->爬完存到自己的数据库
当我们点击的时候跳转到真正的地址上去
核心:搜索,海量数据中搜索出想要的数据
seo:做优化,免费的搜索,排名靠前
sem:花钱买关键字
二、requests模块发送get请求
模拟发送http请求的模块:requests,不仅是做爬虫用到的它,它还可以做调用第三方接口
长链接转短连接:https://www.cnblogs.com/zxr1002/p/16748545.html--->www.XXX
'''安装:'''
pip install requests
'''本质:'''
本质就是封装了内置模块urlib3,requests使用起来简单一点,但是也有人会使用urlib3
'''例子:'''
import requests
res = requests.get('https://www.cnblogs.com/zxr1002/p/16871114.html')
print(res.text) # text就是响应体的文本内容
它返回的不是我们网页里所看到的好看额内容,需要我们去提取所要的内容,解析数据
三、get请求携带参数
'''发送get请求携带数据'''
1.在地址栏后面直接拼接
requests.get('https://www.baidu.com/s?tn=02003390_19_hao_pg&ie=utf-8&wd=%E5%B8%85%E5%93%A5')
2.使用params参数携带
requests.get('https://www.baidu.com/s', params={
'wd'='美女',
'name'='zxr'
})
3.url编码和解码
帅哥---->%E5%B8%85%E5%93%A5
'使用编码与解码:'
from urllib import parse
res=parse.quote('帅哥')
print(res)
res=parse.unquote('%E5%B8%85%E5%93%A5')
print(res)
四、携带请求头
如果没有携带请求头中的客户端类型,网站可能会做出反扒
客户端类型:不允许非浏览器访问
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
import requests
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
res = requests.get('https://dig.chouti.com/', headers=header)
print(res.text)
referer:上次访问的地址
用于做反扒,如果不带referer就会会怀疑是一个恶意的请求,就会禁止掉
就是如果要登录那么正常操作是在登录页面上做的事情,如果不带这个referer,它就怀疑你是恶意的
还可以做图片的防盗链
cookie:认证后的cookie,就相当于登陆了
五、携带cookie
'''请求中携带cookie'''
方式一:
直接带在请求头中
data = {
'linkId': '36996038'
}
header = {
# 客户端类型
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.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'
}
res = requests.post('https://dig.chouti.com/link/vote', data=data, headers=header)
print(res.text)
方式二:通过cookie参数,因为cookie很特殊,一般都需要携带,模块把cookie单独抽取成一个参数,是字典类型,以后可以通过参数传入
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请求
import requests
data = {
'username': '616564099@qq.com',
'password': 'lqz123',
'captcha': 'asxz',
'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,答应的是True
# res2 = requests.get('http://www.aa7a.cn/', cookies=res.cookies)
# 不携带cookies,打印的事False
res2 = requests.get('http://www.aa7a.cn/')
print('616564099@qq.com' in res2.text)
post请求携带数据,data={},json={}
data = 字典是使用默认编码格式:urlencoded
json = 字典是使用json 编码格式
res = requests.post('http://www.aa7a.cn/user.php', json={})
request.session的使用,当request使用,但是它能自动维护cookie
import requests
session = requests.session()
data = {
'username': '616564099@qq.com',
'password': 'lqz123',
'captcha': 'asxz',
'remember': 1,
'ref': 'http://www.aa7a.cn/',
'act': 'act_login'
}
res = session.post('http://www.aa7a.cn/user.php', data=data)
res2 = requests.get('http://www.aa7a.cn/')
print('616564099@qq.com' in res2.text)
七、响应Response
import requests
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',
}
respone = requests.get('https://www.jianshu.com', params={'name': 'lqz', 'age': 19},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
res = requests.get('http://img.netbian.com/file/2022/0930/235928BIh9e.jpg')
with open('mn.jpg', 'wb') as f:
f.write(res.content)
import requests
res = requests.get('https://vd4.bdstatic.com/mda-kg5p9zp3eeax6x9z/v1-cae/sc/mda-kg5p9zp3eeax6x9z.mp4?v_from_s=hkapp-haokan-nanjing&auth_key=1669205146-0-0-30f7bf8e0677d272940a15a81260646a&bcevod_channel=searchbox_feed&pd=1&cd=0&pt=3&logid=2146174762&vid=10030578959322095978&abtest=&klogid=2146174762')
with open('mn.mp4', 'wb') as f:
for line in res.iter_content():
f.write(line)
九、解析json,直接.json就可以了
# 前后分离后,后端给的数据,都是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()))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)