python爬虫

一、requests入门

01.requests发送get请求

"""
准备:安装requests库  pip install requests
     导入requests库  import requests
需求:使用代码获取网站首页内容
步骤:
    1、地址:https://baidu.com/
    2、发送请求:
               requests.get(url='请求地址‘)
    3、获取返回信息:
"""
#导入requests请求魔模块
import requests

#指定地址
url = "https://baidu.com/"

#使用requests发送请求:请求百度首页
requests.get(url=url)

#接受返回的结果
response = requests.get(url=url)

#打印结果
print(response.text)

02.响应数据的获取

"""
准备:安装requests库  pip install requests
     导入requests库  import requests
需求:使用代码获取网站首页内容
步骤:
    1、地址:https://baidu.com/
    2、发送请求:
               requests.get(url='请求地址‘)
    3、获取返回信息:
"""
#导入requests请求魔模块
import requests

#指定地址
url = "https://baidu.com/"

#使用requests发送请求:请求百度首页
requests.get(url=url)

#接受返回的结果
response = requests.get(url=url)

#打印结果
#print(response.text)
# print(response.content.decode())
"""
响应数据的获取:
方式一:response.text           获取的是字符串
方式二:response.content        获取的是原始二进制数据(bytes类型数据)
方式三:response.content.decode()   decode:对二进制的字符串(bytes类型)转换为字符串类型
"""

# 获取http状态码
status = response.status_code

#获取响应对应的请求头
qqt = response.request.headers

#获取响应头
headers = response.headers

#获取cookies
cookies = response.cookies

#获取响应对应的请求cookies
xdq = response.request.cookies

03.str与bytes数据类型的转换

"""
str :字符串数据类型
bytes :bytes类型数据
encode:对字符串进行编码,转换为二进制格式(bytes类型)
decode:对二进制的字符串(bytes类型)转换为字符串类型
"""
#    字符串
s = '你好'

#字符串转换为bytes类型
res = s.encode()
print(res)

#bytes类型的字符串(二进制字符串)
ss = b'\xe4\xbd\xa0\xe5\xa5\xbd'

#将bytes类型转换为字符串类型
res2 = ss.decode()
print(res2)

04.发送请求携带请求头

"""
准备:安装requests库  pip install requests
     导入requests库  import requests
需求:使用代码获取网站首页内容
步骤:
    1、地址:https://baidu.com/
    2、发送请求:
               requests.get(url='请求地址‘)
    3、获取返回信息:
"""
#导入requests请求魔模块
import requests

#指定地址
url = "https://baidu.com/"

#请求头(字典格式)
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

#使用requests发送请求:请求百度首页
requests.get(url=url,headers=headers)

#接受返回的结果
response = requests.get(url=url,headers=headers)

#打印结果
print(response.content.decode())

# 获取请求的请求头信息
print(response.request.headers)
"""
{
'User-Agent'(客户端身份): 'python-requests/2.31.0', 
'Accept-Encoding'(解码类型): 'gzip, deflate', 
'Accept'(请求的数据): '*/*', (任何数据)
'Connection'(连接形式): 'keep-alive'(保持长连接)
}
"""

05.通过requests发送请求下载图片

#导入   requests
import requests

# 指定图片url
url = "https://gips0.baidu.com/it/u=2298867753,3464105574&fm=3028&app=3028&f=JPEG&fmt=auto?w=960&h=1280"

# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

# 发送请求requests.get(url=url)获取相应信息(response)
response = requests.get(url=url,headers=headers)

'''
将响应的内容写入到一个图片文件中

 写     打开      文件名.类型 ,   打开模式wb二进制      没有此文件则新建一个
with   open    ("小老虎.jpg" ,      "wb"      )     as f:
              写    响应  .  响应内容
         f.write(response.content)
'''
with open ("小老虎.jpg", "wb") as f:
    f.write(response.content)

06.发送请求下载网页

#导入   requests
import requests

# 指定图片url
url = "https://baidu.com/"

# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

# 发送请求requests.get(url=url)获取相应信息(response)
response = requests.get(url=url,headers=headers)

# 写入文件
with open ("baidu.html", "w", encoding='utf-8') as f:
    f.write(response.content.decode())

07.通过requests下载网易云音乐


#导入   requests
import requests

# 指定歌曲url
url = "https://m801.music.126.net/20240518151902/76009f53fc78d5fb0bcd97232dac745f/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/36033303850/01e3/e373/23d3/4fc9b631eecdf5079be76c28e853985b.m4a"

# 请求头
headers = {
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

# 发送请求requests.get(url=url)获取相应信息(response)
response = requests.get(url=url)

# 写入文件(视频,图片,音频都需要用wb模式)
with open ("红草莓.m4a", "wb") as f:
    f.write(response.content)

08.反爬虫手段

1.检测请求头中的User-Agent是否是一个正常浏览器的User-Agent
   解决方案:自己设置User-Agent
   headers = {
      "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
   }
2.检测请求的来源(请求头中的Referer属性)(这个请求发送之前打开的是那个页面)------防盗链接
   解决方案:抓包看一下发送穹丘的啊hi后,浏览器发送的Referer值是什么,然后在代码中的请求头中加入Referer
   'Referer':"https://passport.china.com/logon"

二、xpath数据提取

01.获取豆瓣top250的网页数据

#导入   requests
import requests

# 指定图片url
url = "https://movie.douban.com/top250"

# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

# 发送请求requests.get(url=url)获取相应信息(response)
response = requests.get(url=url,headers=headers)

# 写入文件
with open ("douban.html", "w", encoding='utf-8') as f:
    f.write(response.content.decode())

02.在python中使用xpath提取网页数据

"""
导入lxml
将获取的网页内容转换为xml
通过xpath去定位和解析页面中的内容

xpath数据提取技巧:
    1.定位包含所有数据的元素<ol>    //ol
    2.再从中找到包含单条数据所有内容的标签<li>    //ol/li
    3.对定位包含所有元素的列表进行遍历,得到包含单条数据的元素
    4.在提取单条数据中的详细内容
"""
# 导入lxml
from lxml import etree

# 读取html网页内容(请求得到的response.content.decode())   ,读取模式     直接读出
page = open('douban.html', 'r', encoding='utf-8').read()

#将获取的网页内容转换为xml
html = etree.HTML(page)

#通过xpath去定位和解析提取页面中的内容
# titles = html.xpath("//*[@class='title']")

# 获取文本
titles = html.xpath("//*[@class='title'][1]/text()")

# 获取评分
score = html.xpath("//*[@class='rating_num'][1]/text()")

# 显示共有多少个
# print(len(titles))

# 显示内容
print(titles)
print(score)

03.批量提取数据的方式

"""
导入lxml
将获取的网页内容转换为xml
通过xpath去定位和解析页面中的内容

xpath数据提取技巧:
    1.定位包含所有数据的元素<ol>    //ol
    2.再从中找到包含单条数据所有内容的标签<li>    //ol/li
    3.对定位包含所有元素的列表进行遍历,得到包含单条数据的元素
    4.在提取单条数据中的详细内容
"""
# 导入lxml
from lxml import etree

# 读取html网页内容(请求得到的response.content.decode())   ,读取模式     直接读出
page = open('douban.html', 'r', encoding='utf-8').read()

#将获取的网页内容转换为xml
html = etree.HTML(page)

# 定位包含所有数据的元素<ol>再从中找到包含单条数据所有内容的标签<li>
data_list = html.xpath('//ol/li')

# 显示li标签
# print(data_list)

# 对定位包含所有元素的列表进行遍历,得到包含单条数据的元素
for li in data_list:
    title = li.xpath(".//span[@class='title'][1]/text()")
    score = li.xpath(".//span[@class='rating_num'][1]/text()")
    number = li.xpath(".//div[@class='star']/span[last()]/text()")
    print("电影的名称:",title[0],"电影的评分:",score[0],"评价人数:",number[0])

04.top250电影住区代码优化

"""
# 获取单页数据:

# 导入lxml
from lxml import etree

#导入   requests
import requests

# 指定图片url
url = "https://movie.douban.com/top250"

# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

# 发送请求requests.get(url=url)获取相应信息(response)
response = requests.get(url=url,headers=headers)

# 读取html网页内容(请求得到的response.content.decode())   ,读取模式     直接读出
page = response.content.decode()

#将获取的网页内容转换为xml
html = etree.HTML(page)

# 定位包含所有数据的元素<ol>再从中找到包含单条数据所有内容的标签<li>
data_list = html.xpath('//ol/li')

# 对定位包含所有元素的列表进行遍历,得到包含单条数据的元素
for li in data_list:
    title = li.xpath(".//span[@class='title'][1]/text()")
    score = li.xpath(".//span[@class='rating_num'][1]/text()")
    number = li.xpath(".//div[@class='star']/span[last()]/text()")
    print("电影的名称:",title[0],"电影的评分:",score[0],"评价人数:",number[0])
"""

"""
准备好top250电影的url,放入列表中
遍历列表中的url,进行抓取
代码优化
"""
# 导入lxml
from lxml import etree

#导入   requests
import requests

def get_data(url):
    # 请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
    }

    # 发送请求requests.get(url=url)获取相应信息(response)
    response = requests.get(url=url, headers=headers)

    # 读取html网页内容(请求得到的response.content.decode())   ,读取模式     直接读出
    page = response.content.decode()

    # 将获取的网页内容转换为xml
    html = etree.HTML(page)

    # 定位包含所有数据的元素<ol>再从中找到包含单条数据所有内容的标签<li>
    data_list = html.xpath('//ol/li')

    # 对定位包含所有元素的列表进行遍历,得到包含单条数据的元素
    for li in data_list:
        title = li.xpath(".//span[@class='title'][1]/text()")
        score = li.xpath(".//span[@class='rating_num'][1]/text()")
        number = li.xpath(".//div[@class='star']/span[last()]/text()")
        print("电影的名称:", title[0], "电影的评分:", score[0], "评价人数:", number[0])
if __name__ == '__main__':
    get_data("https://movie.douban.com/top250")
    get_data("https://movie.douban.com/top250?start=25&filter=")
    get_data("https://movie.douban.com/top250?start=50&filter=")
    get_data("https://movie.douban.com/top250?start=100&filter=")
    get_data("https://movie.douban.com/top250?start=125&filter=")

05.top250电影翻页抓取

"""
# 生成url
base_url = "https://movie.douban.com/top250?start={}&filter="
for i in range(10):
    url = base_url.format(i*25)
    print(url)
"""
# 导入lxml
from lxml import etree

#导入   requests
import requests

class Douban:
    base_url = "https://movie.douban.com/top250?start={}&filter="

    # 定义一个属性用于保存所有url
    def __init__(self):
        self.url_list = []

       #生成所有页面的url地址保存到url_list属性中
        for i in range(10):
            url = self.base_url.format(i * 25)
            self.url_list.append(url)

    #抓取单页数据
    def get_page_data(self,url):
            # 请求头
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
            }

            # 发送请求requests.get(url=url)获取相应信息(response)
            response = requests.get(url=url, headers=headers)

            # 读取html网页内容(请求得到的response.content.decode())   ,读取模式     直接读出
            page = response.content.decode()

            # 将获取的网页内容转换为xml
            html = etree.HTML(page)

            # 定位包含所有数据的元素<ol>再从中找到包含单条数据所有内容的标签<li>
            data_list = html.xpath('//ol/li')

            # 对定位包含所有元素的列表进行遍历,得到包含单条数据的元素
            for li in data_list:
                title = li.xpath(".//span[@class='title'][1]/text()")
                score = li.xpath(".//span[@class='rating_num'][1]/text()")
                number = li.xpath(".//div[@class='star']/span[last()]/text()")
                print("电影的名称:", title[0], "电影的评分:", score[0], "评价人数:", number[0])

    def run(self):
        for url in self.url_list:
            print("-----------------开始抓取页面:",url)
            self.get_page_data(url)
if __name__ == '__main__':
    db = Douban()
    db.run()

06.xpath语法

nodename                  选取此节点的所有节点
/                         从根节点开始选取
//                        从当前节点开始选取(跟节点下的所有节点元素)
.                         选取当前节点
..                        选取当前节点的父节点
@                         选取属性

路径表达式:
div                       选取div元素的所有节点
/div                      选取div跟元素
div/a                     选取div元素的子元素a
//div                     选取所有div子元素
div//p                    选取div元素的后代的所有div元素
//@lang                   选取选取名为lang的所有属性

根本用法:
根节点下(/)有<head>  <body>
找根节点下的     节点ol      找ol节点下的li节点(//ol/li)
/              /  ol      /li
找根节点下的     节点ol       @class属性
/              /ol        /@class
找根节点下的     节点ol      找ol节点下的li节点  li节点下的span [过滤条件]
/              /ol        /li              /     /span[@class="title"]

谓语条件:
选取属于ul    子元素的第一个  li元素(/ul/li[1])
/ul            /li        [1]
找根节点下的     节点ol      找ol节点下的li节点  li节点下的spanspan[@class="title"]的第一个元素
//ol/li//span[@class="title"][1]
选取属于/ol   子元素的最后一的  span[@class="title"] 元素
//ol/li//span[@class="title"][last()]
选取属于/ol   子元素的倒数第二的  span[@class="title"] 元素
//ol/li//span[@class="title"][last()-1]

选取未知节点:
//*[@class="title"]
选取div元素的所有子元素
/div*
选取文档中的所有元素
//*
选取html下的任意节点元素
html/node()/a/@*
选取带有属性的div元素
//div[@*]

模糊匹配:
跟目录下      text文件中包含”当“字的文件
//*[contains(text(),"当")]
//*[contains(@属性,值)]
//*[contains(@attr,200)]

python 中使用xpath
安装lxml:
pip instakll lxml

三、带参数的页面爬取

01.requests请求参数的传递方式

"""
方式一:
      直接拼接在url后面
      https://www.baidu.com/s?ie=UTF-8&wd=%E9%95%BF%E5%9F%8E
      https://movie.douban.com/top250?start=0&filter=

"""
# # 导入requests  方式一:直接拼接在url后面
# import requests
#
# # 指定url
# url = "https://www.baidu.com/s?ie=UTF-8&wd=%E9%95%BF%E5%9F%8E"
#
# # 请求头
# headers = {
#         "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
#        }
#
# #接收返回的结果
# response = requests.get(url=url,headers=headers)
#
# # 显示获取结果
# print(response.content.decode())


# 导入requests  方式二:通过params参数传递
import requests

# 指定url
url = "https://www.baidu.com/s"

# 请求头
headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
       }

# 请求参数(查询参数)
params = {
    'ie': "UTF-8",
    'wd': "长城"
}

#接受返回结果时,使用params进行传递
response = requests.get(url=url,headers=headers,params=params)

# 显示获取结果
print(response.content.decode())

02.requests发送post请求

"""
发送post请求的功能的方法:
     requests。port()
参数传递:
      1.表单传递:form-data
         requests。port(url,data=字典参数)
      2.json参数:
         requests。port(url,json=字典参数)
"""
# 导入requests
import requests

# 案例一:百度翻译手机版发送post请求 传递表单参数
url = "https://fanyi.baidu.com/sug"

# 请求参数(查询参数)
params = {
    "kw":"python3",
}

# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

# 发送请求获取相应信息(response)
response = requests.post(url=url,data=params,headers=headers)
print(response.content.decode())

03.requests发送post请求

"""
发送post请求的功能的方法:
     requests。port()
参数传递:
      1.表单传递:form-data
         requests。port(url,data=字典参数)
      2.json参数:
         requests。port(url,json=字典参数)
      3.参数:
        code: ""
        email: "3435539036@qq.com"
        encryption: 1
        mobile: ""
        password: "JFA1SybtPsT1KiKg3ZinYA=="
        remember: "0"
        reqtimestamp: 1716270537480
        type: "login"
"""
# 导入requests
import requests

# 案例二:课堂派发送POST请求  传递json参数
url = "https://openapiv5.ketangpai.com//UserAPI/login"

# 请求参数(查询参数)
params = {
    'code':"",
    'type':"login",
    'reqtimestamp': 1716270537480,
    'remember': "0",
    'password': "JFA1SybtPsT1KiKg3ZinYA==",
    'email': "3435539036@qq.com",
    'mobile': ""
}

# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}

# 发送请求获取相应信息(response)
response = requests.post(url=url,json=params,headers=headers)
# print(response.content.decode())
# print(response.json())

04.模拟登录的流程

"""
1.通过控制台抓包:
    登陆的url地址:
    登陆时传递的参数:
    请求方法:

2.网站用户鉴别的方式:
    1.cookie + session 实现
    2.通过token鉴别(浏览器地址与F12地址不同)

3.实现步骤
    1.使用cookie + session鉴别的网站模拟登录的流程:
       1.传递账号密码,进行登录
       2.登陆之后保存cookie(返回时在响应头的set-cookie字段中)
       3.请求其他页面时,携带cookie
    2.通过token鉴别的网站模拟登录的流程:
       1.传递账号密码,进行登录
       2.登陆之后保存token(返回时在响应体中)
       3.请求其他页面时,携带token
"""

05.中华网模拟登录

"""
模拟登录,访问需要登陆之后才能打开的页面
    1.发送登录请求
    2.保存cookie信息
    3.携带cookie信息请求需要登陆的页面
"""
# 导入requests
import requests

# 登陆地址
login_url = "https://passport.china.com/logon"

# 请求参数(查询参数)
params = {
    'userName':"17775990925",
    'password':"a546245426"
}

# 请求头
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
    'Referer': "https://passport.china.com/logon"
}

# 发送请求进行登录(response)
response = requests.post(url=login_url,data=params,headers=headers)
print(response.content.decode())

# 请求需要登录的页面
res2 = requests.get('https://passport.china.com/',headers=headers)
print(res2.content.decode())

06.requests传递cookie的三种方式

"""
模拟登录,访问需要登陆之后才能打开的页面
    1.发送登录请求
    2.保存cookie信息
    3.携带cookie信息请求需要登陆的页面
    4.传递cookie方式:
      方式一:以字典格式传递
        cookie = {}
        requests.post(cookie=cookie)
      方式二:以字符串格式传递
        headers = {
        'Cookie':"字符串格式cookie值"
        }
         requests.get()
"""
# 导入requests
import requests

# 登陆地址
login_url = "https://passport.china.com/logon"

# 请求参数(查询参数)
params = {
    'userName':"17775990925",
    'password':"a546245426"
}

# 请求头
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
    'Referer': "https://passport.china.com/logon"
}

# 发送请求进行登录(response)
response = requests.post(url=login_url,data=params,headers=headers)
print(response.content.decode())

# ---------方式一:以字典格式传递cookie-----------

# 获取cookie信息
cookie = response.cookies

# 请求需要登录的页面
res2 = requests.get('https://passport.china.com/',headers=headers,cookies=cookie)
print(res2.content.decode())

07.一字符串格式传递cookie

"""
模拟登录,访问需要登陆之后才能打开的页面
    1.发送登录请求
    2.保存cookie信息
    3.携带cookie信息请求需要登陆的页面
    4.传递cookie方式:
      方式一:以字典格式传递
        cookie = {}
        requests.post(cookie=cookie)
      方式二:以字符串格式传递
        headers = {
        'Cookie':"字符串格式cookie值"
        }
         requests.get()
"""
# 导入requests
import requests

# ---------方式二:以字符串格式传递cookie-----------
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
    'Referer': "https://passport.china.com/logon",
    'Cookie':'SESSION_COOKIE=46; Hm_lvt_cbec92dec763e6774898d6d85460f707=1716272312; JSESSIONID=E8C2935D3D9A62C369520B06B8FAFAC1; Hm_lpvt_cbec92dec763e6774898d6d85460f707=1716278459; nickname=china_2823hxfg16791058; lastlogindate=2024-05-21; lastlogintime="16:02:24"; lastloginip=183.197.61.99; bindMobile="1@177*****925"; CHINACOMID=11aebc10-cb6e-476d-8072-f953d8bf65a27; CP_USER=FKBo6w-aaDELXK1EnoT3DPk1faoTCuWOzIpsuaQNIsJWqiRz6o9drrZQMJZRRbngi7eJikd0sv41eZDrzksZGmumfJyC7TEP5dMN41%2F1QIHag0K39t%2FVBxzGqQTN85yGDbzc7Mtf21I3yLFRNUeRkJJphQBjDXyUilJ6T4hZkczaUzzJCsTyVeqCVs1bNEBlVJl21LerScqkV2HierMz-5HYL8DoELcjmlLJ6WjemIAiC44IuLq2ow%3D%3D; CP_USERINFO=4Gkk4uas%2FGU6V4cAn8Kr14YtZHaRsQ3bb0iKxhYvuaLYLT-rPEFbvbaQzjvqSKm2v8Fd1lQ14weg0PM1aAxGqjzFStaNWwdXEhS3Zzs0jusNqPIZSkWIUHBpa7NyrsBUv2O8QVvh3O4yqW9wAjnfpw%3D%3D; china_variable=jpEe7N32pYz8SAjCjL8fnh2eLZiI1D/EC6dYmS6/lLUOPrHJGj-IxLIHbACvhNcaC9z3Z8pi2hy0JtYoQGGXmsutg32di8lhAZaSKKJ8BFBt-lJZl7B3R-LY1hWhKpza; lastlogindate=2024-05-21; lastlogintime="16:02:24"; lastloginip=183.197.61.99'
}

# 请求需要登录的页面
res2 = requests.get('https://passport.china.com/',headers=headers)
print(res2.content.decode())

08.使用requests中的session自动处理cookie

"""
模拟登录,访问需要登陆之后才能打开的页面
    1.发送登录请求
    2.保存cookie信息
    3.携带cookie信息请求需要登陆的页面
    4.传递cookie方式:
      方式一:以字典格式传递
        cookie = {}
        requests.post(cookie=cookie)
      方式二:以字符串格式传递
        headers = {
        'Cookie':"字符串格式cookie值"
        }
         requests.get()
      方式三:requests。session
"""
# 导入requests
import requests

# 登陆地址
login_url = "https://passport.china.com/logon"

# 请求参数(查询参数)
params = {
    'userName':"17775990925",
    'password':"a546245426"
}

# 请求头
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
    'Referer': "https://passport.china.com/logon"
}

#1. 使用requests.session创建一个请求对象
http = requests.session()

#2. 发送请求进行登录(response)
response = http.post(url=login_url,data=params,headers=headers)

#3. 请求需要登录的页面
res2 = http.get('https://passport.china.com/',headers=headers)
print(res2.content.decode())

四、ajax异步加载的数据提取

01.domo抓取异步数据

#导入requests
import requests

# 指定url
url = ""

requests = reponse = requests.get(url)

print(requests.text)

02.TX招聘数据抓取

#导入requests
import  requests

# 指定url
url = ""

# 获取数据
reponse = requests.get(url)

# 获取json数据:使用json方法获取响应内容
result = reponse.json()

# 获取所有的岗位数据
Posts = result['Data']['Posts']

# 遍历所有的岗位数据
for item in Posts:
    print(item)
    

03.TX招聘数据分页抓取

# 导入requests
import requests

# 导入time
import time

# 写入文件
f = open ("岗位.txt",'a',encoding='utf-8')

# 设置抓取页数
for i in range(1,11):

    # 指定url
    url = "https://careers.tencent.com/tencentcareer/api/post/Query"

    # 请求参数(查询参数)
    params = {
        'pageIndex':i,
        'timestamp':int(time.time()*100),
        'categoryId':"40008,40002001,40002002,40003001,40003002,40003003,40004,40005001,40005002,40006,40007,40009,40010,40011,40001001,40001002,40001003,40001004,40001005,40001006",
        'attrId':"1,3,2,5",
        'pageSize':20,
        'language':"zn-cn",
        'area':"cn",
        'countryId':"",
        'cityId':"",
        'bgIds':"",
        'productId':"",
        'keyword':"",
    }

    # 获取数据
    reponse = requests.get(url,params)

    # 获取json数据:使用json方法获取响应内容
    result = reponse.json()

    # 获取所有的岗位数据
    Posts = result['Data']

    # 遍历所有的岗位数据
    for item in Posts:
        print(item)
        # 将岗位写入文件
        # f.write(str(item))

# 关闭文件
f.close()

04.json语法

{}                         json对象
[]                         json数组
json.loads                 json字符串转换为python字符串
json.dump                  pyton字符串转换为json字符串

五、json数据的处理

01.json与python数据的转换

"""
json.loads:将json数据转换为python数据格式
json.dumps:将python数据转换为json数据格式

"""

#导入json
import json

# 加载数据
with open('datas.json','r',encoding='utf-8') as f:
    j_data = f.read()
    print(j_data)

    # 将json数据转换为python数据格式
    py_data = json.loads(j_data)
    print(py_data)

datas2 = {"name": "张三",
          "age": "18",
          "skill": ["python","html","css","js","java"],
          "isDelete": True,
          "isActive": False,
          "addr": None
          }

# 将python数据转换为json数据格式
json_data2 = json.dumps(datas2,ensure_ascii=False,indent=4)
print(json_data2)

# 写入文件
with open("datas.json",'w',encoding='utf-8') as f:
    f.write(json_data2)

六、视频抓取

01.B站视频抓取

"""
视频url:
音频url:
"""
# 导入requests
import requests

# 请求头
headers = {
    'User-Agent': "",
    'Cookie': "",
    'Referer':""
}

# 视频url
url1 = ""

# 音频url
url2 = ""

# 发起请求
resp1 = requests.get(url1, headers=headers)
resp2 = requests.get(url2, headers=headers)

with open('sp1.mp4', 'wb') as f:
    f.write(resp1.content)
with open('sp2.mp4', 'wb') as f:
    f.write(resp2.content)

"""
开始视频合成
安装MoviePy   pip install MoviePy
"""
# 开始视频合成
from moviepy.editor import ffmpeg_tools

# 将本地的hh2.MP4和hh3.MP4 合成为 下载文件.MP4
ffmpeg_tools.ffmpeg_merge_video_audio('sp1.np4','sp2.mp4','下载视频.mp4')

02.抖音视频抓取

"""
视频
url = https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cp6vh3vog65paio4vud0&line=0&file_id=911d2050e09548bcaf042affd992f9ed&sign=9c4d93213847699cc113aa9310f13df4&is_play_url=1&source=PackSourceEnum_FEED&aid=6383
"""
# 导入
import requests

# 指定url
url = "https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cp6vh3vog65paio4vud0&line=0&file_id=911d2050e09548bcaf042affd992f9ed&sign=9c4d93213847699cc113aa9310f13df4&is_play_url=1&source=PackSourceEnum_FEED&aid=6383"

# 请求头
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
    'Cookie': "",
    'Referer':""
}

# 发起请求
response = requests.get(url=url,headers=headers)

# 写入文件
with open("抖音视频.mp4", 'wb') as f:
    f.write(response.content)

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值