scrapy+selenium框架模拟登录

news/2024/7/3 4:16:40

目录

一、cookie和session实现登录原理

二、模拟登录方法-Requests模块Cookie实现登录

三、cookie+session实现登录并获取数据

四、selenium使用基本代码

五、scrapy+selenium实现登录


一、cookie和session实现登录原理

cookie:1.网站持久保存在浏览器中的数据2.可以是长期永久或者限时过期

session:1.保存在服务器中的一种映射关系2.在客户端以Cookie形式储存Session_ID

二、模拟登录方法-Requests模块Cookie实现登录

import requests

url = 'http://my.cheshi.com/user/'

headers = {
    "User-Agent":"Mxxxxxxxxxxxxxxxxxxxxxx"
}
cookies = "pv_uid=16xxxxx;cheshi_UUID=01xxxxxxxxx;cheshi_pro_city=xxxxxxxxxxx"
cookies = {item.split("=")[0]:item.split("=")[1] for item in cookies.split(";")}
cookies = requests.utils.cookiejar_from_dict(cookies)
res = requests.get(url, headers=headers, cookies=cookies)

with open("./CO8L02.html","w") as f:
    f.write(res.text)

三、cookie+session实现登录并获取数据

如下两种方法:

import requests

url = "https://api.cheshi.com/services/common/api.php?api=login.Login"
headers = {
    "User-Agent":"Mxxxxxxxxxxxxx"
}
data = {
    "act":"login",
    "xxxx":"xxxx"
    ........
}
res = requests.post(url, headers=headers, data=data)
print(res.cookies)

admin_url = "http://my.cheshi.com/user/"
admin_res = requests.get(admin_url, headers=headers, cookies=res.cookies)

with open("./C08L03.html","w") as f:
    f.write(admin_res.text)
import requests

url = "https://api.cheshi.com/services/common/api.php?api=login.Login"
headers = {
    "User-Agent":"Mxxxxxxxxxxxxx"
}
data = {
    "act":"login",
    "xxxx":"xxxx"
    ........
}
session = requests.session()
session.post(url, headers=headers, data=data)

admin_url = "http://my.cheshi.com/user/"
admin_res = session.get(admin_url, headers=headers)
with open("./C08L03b.html","w") as f:
    f.write(admin_res.text)

四、selenium使用基本代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 实现交互的方法
from selenium.webdriver import ActionChains
import time

service = Service(executable_path="../_resources/chromedriver")
driver = webdriver.Chrome(service=service)
driver.get("http://www.cheshi.com/")

# print(drive.page_source)
# print(driver.current_url)
# with open("./C08L05.html", "w") as f:
#     f.write(drive.page_source)

# # 屏幕截图
# driver.save_screenshot("C08L05.png")

"""元素定位方法."""
# 注意:不要在xpath里面写text()会报错
h1 = driver.find_element(By.XPATH, "//h1")
h1_text = h1.text

# 虽然是//p 但是text后只能拿到第一个元素,若拿所有元素需要用find_elements后循环遍历
#items = driver.find_element(By.XPATH, "//p")
# print(items.text)

items = driver.find_elements(By.XPATH, "//p")
print(items.text)
for item in items:
    print(item.text)

p = driver.find_element(By.XPATH, '//p[@id="primary"]')
print(p.text)
print(p.get_attribute("another-attr"))

# 为了防止报错,可以用try,except方法防止中断程序


"""元素交互方法."""
username = driver.find_element(By.XPATH, '//*[@id="username"]')
password = driver.find_element(By.XPATH, '//*[@id="password"]')

ActionChains(driver).click(username).pause(1).send_keys("abcde").pause(0.5).perform()
ActionChains(driver).click(password).pause(1).send_keys("12345").pause(0.5).perform()
time.sleep(1)

div = driver.find_element(By.XPATH, '//*[@id="toHover"]')
ActionChains(driver).pause(0.5).move_to_element("div").pause(2).perform()
time.sleep(1)

div = driver.find_element(By.XPATH, '//*[@id="end"]')
ActionChains(driver).scroll_to_element("div").pause(2).perform()
time.sleep(1)
ActionChains(driver).scroll_by_amount(0,200).perform()
time.sleep(1)

time.sleep(2)
driver.quit()

五、scrapy+selenium实现登录

在scrapy中的爬虫文件(app.py)中修改如下代码(两种方法):

import scrapy

class AppSpider(scrapy.Spider):
    name = "app"
    # allowed_domains = ["my.cheshi.com"]
    # start_urls = ["http://my.cheshi.com/user/"]
    def start_requests(self):
        url = "http://my.cheshi.com/user/"
        cookies = "pv_uid=16xxxxx;cheshi_UUID=01xxxxxxxxx;cheshi_pro_city=xxxxxxxxxxx"
        cookies = {item.split("=")[0]:item.split("=")[1] for item in cookies.split(";")}
        yield scrapy.Request(url=url, callback=self.parse,cookies=cookies)

    def parse(self,response):
        print(response.text)
import scrapy

class AppSpider(scrapy.Spider):
    name = "app"
    # allowed_domains = ["my.cheshi.com"]
    # start_urls = ["http://my.cheshi.com/user/"]
    def start_requests(self):

        url = "https://api.cheshi.com/services/common/api.php?api=login.Login"
        data = {
            "act":"login",
            "xxxx":"xxxx"
            ........
        }
        yield scrapy.FormRequest(url=url, formdata=data,callback=self.parse)

    def parse(self,response):
        url = "http://my.cheshi.com/user/"
        yield scrapy.Request(url=url, callback=self.parse_admin)

    def parse_admin(self, response):
        print(response.text) 

http://lihuaxi.xjx100.cn/news/1745802.html

相关文章

数据结构与算法:使用数组模拟队列Java版

逻辑分析 代码实现 package com.haimeng.queue;import java.util.Scanner;public class ArrayQueueDemo {public static void main(String[] args) {//测试一把//创建一个队列ArrayQueue queue new ArrayQueue(3);char key ; //接收用户输入Scanner scanner new Scanner(S…

索引失效的场景有哪些?

虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。下面是引起这种问题的几个关键点。 列与列对比 某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引 select…

HHDBCS扩展数据库类型

为应对市面上的数据库种类繁多的问题,HHDBCS设置了扩展数据库功能。 在登陆界面点击“工具”,选择“扩展数据库类型”; 注:HHDBCS支持已kingbase,本文仅用来举例。 填入名称、所需数据库的信息,上传驱动…

【【深入浅出了解AXI4协议 - 2】】

深入浅出了解AXI4协议 - 2 AXI总线共有五个通道 read address channel write address channel read data channel write data channel write response channel 信息源 通过VALID 信号 来指示 通道中的 数据和 控制信号 什么时候 有效 目的源 READY 表示何时接收数据 读数据 …

php 接口请求一次,controller调用了两次。

这几天开发一个数据导出功能 由于是数据导出,所以有点慢。然后发现一个问题,前端只请求一次,controller却收到了两次请求。而且第二次请求i必定失败 这就悲催了。脑子懵懵的! 由于我这就是个小活儿,于是环境就是使用…

基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)

一、项目简介 本项目是一套基于springboot框架实现的宠物医院管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单…

【WPF系列】- XAML语法规范

【WPF系列】- XAML语法规范 文章目录 【WPF系列】- XAML语法规范一、概述二、对象元素语法三、特性语法(属性)四、特性值的处理五、枚举特性值六、属性和事件成员名称引用七、属性元素语法八、集合语法九、XAML 内容属性XAML 内容属性值必须是连续的 十、…

数据库实验:SQL的数据定义与单表查询

目录 实验目的实验内容实验要求实验过程实验步骤实例代码结果示意 数据库的实验,对关系型数据库MySQL进行一些实际的操作 实验目的 (1) 掌握DBMS的数据定义功能 (2) 掌握SQL语言的数据定义语句 (3) 掌握RDBMS的数据单表查询功能 (4) 掌握SQL语言的数据单表查询语句…