day01
内容概要
- 爬虫介绍
- request模块介绍
- request发送get请求
- request携带参数
- url编码解码
- 携带请求头
- 发送post请求,携带数据
- 自动登录,携带cookie的两种方式
- request.session的使用
- 补充post请求携带数据编码格式
- 响应Response对象
- 编码问题
- 下载图片,视频
爬虫介绍
-
爬虫什么
爬虫就是程序---》从互联网中,各个网站上,爬取数据[你能浏览的页面才能爬],做数据清洗,入库
-
爬虫的本质
模拟方式http请求,获取数据--》入库
网站
app:抓包
-
百度其实就是一个大爬虫
百度爬虫一刻不停的在互联网中爬取各个页面---》爬取完后--》保存到自己的数据库中
你在百度搜索框中搜索---》百度自己的数据库查询关键字--》返回回来
点击某个页面---》跳转到真正的地址上
SEO(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是让其在行业内占据领先地位,获得品牌收益。很大程度上是网站经营者的一种商业行为,将自己或自己公司的排名前移。
SEM:搜索引擎营销:英文Search Engine Marketing ,我们通常简称为“SEM”。简单来说,搜索引擎营销就是基于搜索引擎平台的网络营销,利用人们对搜索引擎的依赖和使用习惯,在人们检索信息的时候将信息传递给目标用户。搜索引擎营销的基本思想是让用户发现信息,并通过点击进入网页,进一步了解所需要的信息。企业通过搜索引擎付费推广,让用户可以直接与公司客服进行交流、了解,实现交易。
简单就是 SEM是掏钱的
-
咱们学习的
模拟发送http请求
- request模块
- selenum
- 反扒:封ip:ip代理,封帐号:cookie池
解析数据:bs4
入口:mysql,redis,文件中
爬虫框架:scrapy
requests模块介绍
使用python如何发送http请求
模块:requests模块,封装了pytho内置模块urllib
使用request可以模拟浏览器的请求(http),比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
安装
pip install reqeusts
request发送get请求
import requests
url = 'https://www.baidu.com/'
res = requests.get(url=url)
print(res.text)
如果有的网站,发送请求,不返回数据,人家做了反扒--》拿不到数据,学习如何反扒
request携带参数
# 携带参数
import requests
# 方式一
res = requests.get('https://www.baidu.com?name=lqz&age=18')
# print(res.text)
print(res.url)
# 方式二
res = requests.get('https://www.baidu.com',
params={"name": "lqz",
"age": 18})
# print(res.text)
print(res.url)

url编码解码
import requests
# 编码 解码
from urllib.parse import quote, unquote
res = requests.get("https://www.baidu.com", params={"name": "彭于晏"})
print(res.url) # 打印当前的url https://www.baidu.com/?name=%E5%BD%AD%E4%BA%8E%E6%99%8F
res1 = '%E5%BD%AD%E4%BA%8E%E6%99%8F'
print(quote("彭于晏")) # %E5%BD%AD%E4%BA%8E%E6%99%8F
print(unquote("%E5%BD%AD%E4%BA%8E%E6%99%8F")) # 彭于晏
# 如果有中文, 在地址栏中会做url编码
携带请求头
# 携带请求头
# 反扒措施之一,就是请求头
# http请求中,请求头中有一个很重要的参数User-Agent
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
import requests
"""
(Windows NT 10.0; Win64; x64) window10 win10的系统 win64 电脑型号
Chrome/111.0.0.0 使用的谷歌浏览器 111.0.0.0 的版本
"""
# 如果没有带这个请求头 后端就禁止了
# request 发送请求,没有携带该参数,所以有的网址就禁止了
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
}
res = requests.get("https://www.bilibili.com/", headers=headers)
print(res.text)
发送post请求携带数据
import requests
headers = {
"Cookie": "",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}
res = requests.post("https://dig.chouti.com/link/vote", headers=headers,
data={
'linkId': 38068724
})
print(res.text)

自动登录,携带cookie的两种方式
# import requests
#
# headers = {
# "Cookie": "deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiI0MDM3NTVmMi05NTQ5LTQ3ODYtODE4YS1kNjYwNmU0OTViM2YiLCJleHBpcmUiOiIxNjgxNDczMTUyNzc0In0.-DSFFe5f63VRjadwpr6c-iiIQaB-yFsdtBxWgVULE7s; Hm_lvt_03b2668f8e8699e91d479d62bc7630f1=1678881156; __snaker__id=KFIObfZTu91okiSy; gdxidpyhxdE=M0Uu%2B1r5E9WEfc3JiCI0q2LIHZ%5Cx6dXyaxU75SPAzxMYTfYIM8a929VcONKwKCtJb0NeD9GBM%2FjjnOsMZP7h9XQAVc%5CXYGEMT%2BRNUKwSbciHyx%2F2xwrI8%2BD9iSvu%2B9IbOzl%5CQxs50szH%2FJMsnZThnCRQLQ%5CrQr9hDI%2BlKclyz8ogYYos%3A1678882072689; YD00000980905869%3AWM_NI=7mqu%2FnBIuqMkgMDgcA5K1C%2BK0R27aB0LvkoC6XaJ1RonqxKl%2Ff9kIpdLyzHvpPWstqQ32QlwdkIQ2OrxMvmGdc0trObCZSYTH3uWyHQoubYT1xDv1SO9n7e8TjOuX8SURUU%3D; YD00000980905869%3AWM_NIKE=9ca17ae2e6ffcda170e2e6eea4d325f3e7e5d6ae80b79a8eb2c85b938a9a83d541a3efa7a7b55c8be88186f82af0fea7c3b92af5b3bf96ae668297bb92d061a5938c88e24bf795ffa4aa41f48efed8e44af494ba8cee49f688afabb45aadb2bf99ca68edbaf78ccc7ca894b79bcb7eb4909994f77b93edfeb2ef7da8b587b2b145b2a88397f04da8bd0095f145a29d96b4dc608cedbbb8fc4493b1bb83dc60f3a88c97b4598de7a2d8e83498b68196db34918b9eb6d837e2a3; YD00000980905869%3AWM_TID=mENlfD4Wd15AQFAVRVPQfKh2BreYpaeu; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjdHVfNjc4ODgxMzQyMDUiLCJleHBpcmUiOiIxNjgxNDczMzQyMTY2In0.CktHx03URJL7dASX4KJrvwbc7wY08gepKRufe068wY4; Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1=1678881346",
# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}
# res = requests.post("https://dig.chouti.com/link/vote", headers=headers,
# data={
# 'linkId': 38068724
# })
# print(res.text)
import requests
data = {"username": "",
'password': '',
'captcha': '123',
'remember': '1',
'ref': 'http://www.aa7a.cn/index.php',
'act': "act_login"}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}
res = requests.post("http://www.aa7a.cn/user.php", headers=headers, data=data)
print(res.text)
cookies = res.cookies
# 访问首页,get请求,携带cookie,首页返回的数据一定会有 我的账号
# 携带cookie的两种方式 方式一是字符串,方式二是字典或CookieJar对象
# 方式二:放到cookie参数中
res = requests.post("http://www.aa7a.cn/", cookies=cookies, headers=headers)
print("" in res.text)
requests.session的使用
为了保持cookie,以后不需要携带cookie
# 为了保持cookie ,以后不需要携带cookie
import requests
data = {
'username': '',
'password': '',
'captcha': '3456',
'remember': 1,
'ref': 'http://www.aa7a.cn/',
'act': 'act_login'
}
session = requests.session()
res = session.post('http://www.aa7a.cn/user.php', data=data)
print(res.text)
res1 = session.get('http://www.aa7a.cn/') # 自动保持登录状态,自动携带cookie
print('616564099@qq.com' in res1.text)
补充post请求携带数据编码格式
import requests
# data对应字典,这样写,编码方式是urlencoded
requests.post(url='xxxxxxxx',data={'xxx':'yyy'})
# json对应字典,这样写,编码方式是json格式
requests.post(url='xxxxxxxx',json={'xxx':'yyy'})
# 终极方案,编码就是json格式
requests.post(url='',
data={'':1,},
headers={
'content-type':'application/json'
})
响应Response对象
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}
response = requests.get('http://www.jianshu.com', headers=headers)
# response 属性
# print(response.text) # 文本的格式
# print(response.content) # 二进制格式
# print(response.cookies) # RequestsCookieJar格式 获取的是cookie\
# print(response.cookies.get_dict()) # 字典形式
# print(response.cookies.items()) # 键值对 列表套元组
# print(response.url) # https://www.jianshu.com/ 当前的路由
# print(response.request.url) # <PreparedRequest [GET]> 请求对象
# print(response.encoding) # 响应体的编码格式
# print(response.history) # 重定向的地址
# 比如 你向 A发送请求 A重定向到B那么 response.url 获取的就是 B的地址
# 而A的地址就会放到 response.history 里面
# response = requests.get('https://dig.chouti.com/link/vote', headers=headers)
# print(response.raw.info)
# print(response.history) # 返回包含请求(URL)历史的响应对象列表
# print(response.url)
作业
import re
import requests
url = 'https://www.qqtn.com/tx/meinvtx_0.html'
res = requests.get(url)
url_list = re.findall('<img src="(.*?.jpg)" alt="(.*?)">', res.text)
print(url_list)
for url, name in url_list:
with open("./aa/%s.jpg" %(name.split(" ")[0]), "wb") as f:
res = requests.get(url)
for i in res.iter_content():
f.write(i)

浙公网安备 33010602011771号