模拟登录1-古诗文网

import requests
from lxml import etree
from PIL import Image
import pytesseract

url = 'https://so.gushiwen.cn/user/login.aspx'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}

def login():
    session = requests.Session()
    resonpse = session.get(url=url,headers=headers)
    tree = etree.HTML(resonpse.text)
    code_img_src = 'https://so.gushiwen.cn/' + tree.xpath('//*[@id="imgCode"]/@src')[0]
    viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
    img_data = session.get(url = code_img_src, headers = headers).content
    with open('img.jpg','wb') as f:
        f.write(img_data)

    image = Image.open('img.jpg')
    #需要将图片转为RGB格式
    image = image.convert('RGB')
    code = pytesseract.image_to_string(image)
    if(len(code) >= 4):
        code = code[:4]
        print('验证码为:'+ code)
        # 组织fromdata
        data = {
            '__VIEWSTATE' : viewstate,
            '__VIEWSTATEGENERATOR': 'C93BE1AE',
            'email': 'xxxx',
            'pwd': 'xxxx',
            'code': code,
            'denglu': '登录'
        }
        response = session.post(url=url,data=data)
        if(response.status_code == 200):
            print(len(response.text))
            tree = etree.HTML(response.text)
            login_flag = tree.xpath('//*[@id="html"]/body/div[2]/div[1]/span[1]')
            if(login_flag):
                print('登录成功!')
            else:
                print('login failed !')
                return login()
    else:
        print('识别失败,重新登录!')
        return login()


# 由于tesserate识别准确录太低,所以进行了多次识别,登录成功后才返回
if __name__ == '__main__': 
    login()

对于这种简单的字符验证码可以借助tesseract等orc来进行识别,虽然免费,但是识别准确率较低。

登录效果

AZ3S.
验证码为:AZ3S
13011
login failed !
PM28
验证码为:PM28
13853
登录成功!

对于这种简单的字符验证码分为以下几种情况

1.验证码的url不变,验证码也不变

这种情况最简单,直接解析出验证码的url,直接向验证码的url发起请求,保存验证码,然后进行识别

2. 验证码的url不变,验证码一直在变

这种情况在向目标网址发起请求时,实例化一个session,用session来维持会话,并用session来向验证码的url发起请求(本例就是此种形式)

3. 验证码的url后面加上随机参数,且验证码一直变

function reload() {
    var verifyObject = $('#code_img');
    verifyObject.attr('src',verifyObject.attr('src').split('?')[0]+'?'+Math.random());
}
原因:浏览器下使用GET发送请求时,如果两次请求的地址和参数相同,
在不刷新页面的情况下,浏览器会缓存第一次请求的内容,服务端更新后浏览器仍然显示第一次的内容。 


因此,GET请求URL后加随机数或者时间戳,让服务器认为不是相同的请求。进而加载不同的验证码。

此种方式按第一种方式处理
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题可以通过模拟登录古诗文,并爬取个人收藏列表来解决。以下是实现的步骤: 1. 导入必要的库:requests、BeautifulSoup、re、json、time、selenium 2. 使用selenium模拟登录古诗文,获取登录后的cookies 3. 使用requests库发送请求,带上cookies获取个人收藏列表页面的HTML内容 4. 使用BeautifulSoup解析HTML内容,获取收藏列表中每首古诗的链接 5. 使用requests库发送请求,获取每首古诗的具体页面HTML内容 6. 使用正则表达式或BeautifulSoup解析HTML内容,获取古诗的名字和作者 以下是代码实现的详细步骤: ```python import requests from bs4 import BeautifulSoup import re import json import time from selenium import webdriver # 设置登录账号和密码 username = "your_username" password = "your_password" # 使用selenium模拟登录获取cookies login_url = "https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx" driver = webdriver.Chrome() driver.get(login_url) driver.find_element_by_id("email").send_keys(username) driver.find_element_by_id("pwd").send_keys(password) driver.find_element_by_id("denglu").click() time.sleep(5) cookies = driver.get_cookies() cookies_dict = {} for cookie in cookies: cookies_dict[cookie['name']] = cookie['value'] # 使用cookies发送请求获取收藏列表页面的HTML内容 collection_url = "https://so.gushiwen.cn/user/collect.aspx" response = requests.get(collection_url, cookies=cookies_dict) html = response.text # 使用BeautifulSoup解析HTML内容,获取收藏列表中每首古诗的链接 soup = BeautifulSoup(html, "html.parser") poems = soup.find_all("div", class_="sons") poem_links = [] for poem in poems: link = poem.find("a")["href"] poem_links.append("https://so.gushiwen.cn" + link) # 使用requests库发送请求,获取每首古诗的具体页面HTML内容,并使用正则表达式或BeautifulSoup解析HTML内容,获取古诗的名字和作者 for link in poem_links: response = requests.get(link, cookies=cookies_dict) html = response.text soup = BeautifulSoup(html, "html.parser") title = soup.find("div", class_="cont").find("h1").text.strip() author = soup.find("div", class_="cont").find("p", class_="source").text.strip() author = re.sub(r"\s+", " ", author).split(" ")[0][:-1] print(title, author) ``` 这样就可以成功爬取个人收藏列表中的古诗的名字和作者了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值