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)

image-20230315193453612

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)

image-20230315200013077

自动登录,携带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)
posted @ 2023-03-15 21:24  可否  阅读(24)  评论(0)    收藏  举报