当前位置: 首页 > news >正文

初始爬虫5


响应码:

数据处理: re模块(正则表达式)

re模块是Python中用于正则表达式操作的标准库。它提供了一些功能强大的方法来执行模式匹配和文本处理。以下是re模块的一些常见用法及其详细说明:

1. 基本用法
1.1 匹配模式
re.match(pattern, string):
功能:从字符串的开头开始匹配模式。
返回:一个匹配对象(Match对象)如果匹配成功,否则返回None。
示例:
python
import re
result = re.match(r'\d+', '123abc')
if result:
    print(result.group())  # 输出 '123'
1.2 搜索模式
re.search(pattern, string):
功能:扫描整个字符串并返回第一个匹配的结果。
返回:一个匹配对象(Match对象)如果匹配成功,否则返回None。
示例:
python
import re
result = re.search(r'\d+', 'abc123def')
if result:
    print(result.group())  # 输出 '123'
1.3 查找所有匹配
re.findall(pattern, string):
功能:查找所有匹配的子串并以列表形式返回。
返回:一个列表,其中包含所有匹配的字符串。
示例:
python
import re
results = re.findall(r'\d+', '123 abc 456 def 789')
print(results)  # 输出 ['123', '456', '789']
1.4 替换文本
re.sub(pattern, repl, string):
功能:用指定的替换文本替换匹配的模式。
返回:替换后的字符串。
示例:
python
import re
result = re.sub(r'\d+', '#', 'abc 123 def 456')
print(result)  # 输出 'abc # def #'
1.5 分割字符串
re.split(pattern, string):
功能:根据模式分割字符串。
返回:一个列表,其中包含分割后的字符串。
示例:
python
import re
result = re.split(r'\W+', 'hello, world! Python is great.')
print(result)  # 输出 ['hello', 'world', 'Python', 'is', 'great', '']


2. 正则表达式的特殊字符
.:匹配除换行符外的任何字符。
^:匹配字符串的开头。
$:匹配字符串的结尾。
*:匹配前一个字符零次或多次。
+:匹配前一个字符一次或多次。
?:匹配前一个字符零次或一次。
{n}:匹配前一个字符恰好n次。
{n,}:匹配前一个字符至少n次。
{n,m}:匹配前一个字符至少n次,但不超过m次。
[]:匹配括号内的任意字符。
|:表示“或”操作。
\d:匹配任何数字,等同于[0-9]。
\D:匹配任何非数字字符。
\w:匹配任何字母数字字符,等同于[a-zA-Z0-9_]。
\W:匹配任何非字母数字字符。
\s:匹配任何空白字符,包括空格、制表符和换行符。
\S:匹配任何非空白字符。


3. 匹配对象方法
group():返回匹配的字符串。
groups():返回一个包含所有匹配组的元组。
start():返回匹配的开始位置。
end():返回匹配的结束位置。
span():返回匹配的起始和结束位置的元组。
示例:
python
import re

# 定义模式和字符串
pattern = r'(\d+)'
string = 'There are 123 apples and 456 oranges.'

# 使用 re.search 查找第一个匹配
match = re.search(pattern, string)
if match:
    print(match.group())  # 输出 '123'
    print(match.groups())  # 输出 ('123',)

# 使用 re.findall 查找所有匹配
matches = re.findall(pattern, string)
print(matches)  # 输出 ['123', '456']


4. 编译正则表达式
re.compile(pattern):
功能:将正则表达式编译成一个正则表达式对象,可以多次使用。
示例:
import re
pattern = re.compile(r'\d+')
result = pattern.findall('The numbers are 123 and 456.')
print(result)  # 输出 ['123', '456']

模拟github登录(异地登录需要邮件验证码未解决)

GitHub网站:https://github.com/login

勾选Preserve log,记录每次响应: 

登录后查看post请求产生的Payload,此处信息可以两次登录对比看,以此得到想要模拟的登录信息:

完整实现github登录代码: 

# -*- coding: utf-8 -*-
import re# 1.获取并模拟登录操作 2.保存登录会话信息 3.验证是否登录成功
import requests
from requests import Sessiondef do_auth_token(session: Session):global responseresponse = session.get('https://github.com/login')if response.status_code != 200:print("请求失败,请稍后再试!")exit(0)login_html = response.content.decode()auth_token = re.findall(r'name="authenticity_token" value="(.*?)"', login_html)[0]return auth_tokendef do_auth_login(session: Session):post_data = {"commit": "Sign in","authenticity_token": auth_token,"login": "123456","password": "123456",  # 登录密码,为了个人账号安全我这里不是真实密码"webauthn-conditional": "undefined","javascript-support": "true","webauthn-support": "supported","webauthn-iuvpaa-support": "unsupported","return_to": "https://github.com/login"}response = session.post(url='https://github.com/session', data=post_data)if response.status_code != 200:print("请求失败,请检查参数!")else:print("请求session 成功!")def do_login_status(session: Session):response = session.get('https://github.com/csqting')html_content = response.contentresponse1 = re.findall(r'<title>(.+?)(GitHub)?</title>', html_content.decode('utf-8'))try:end_str = response1[0][1]except IndexError:end_str = ""if end_str == "":# 个人主页的title内容如果结尾没有GitHub,说明登录成功print("登录成功!")else:print("登录失败!")with open("github_profile.html", "wb") as f:f.write(html_content)if __name__ == '__main__':# 使用session进行状态保持session = requests.session()session.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}# 1. 获取并模拟登录操作auth_token = do_auth_token(session)# 2. 保存登录会话信息do_auth_login(session)# 3. 验证是否登录成功do_login_status(session)

 

 

到此requests模块基本结束,下面就是数据提取的学习。 

http://www.lryc.cn/news/436885.html

相关文章:

  • 深度盘点:2024年企业最喜欢用的WMS仓库管理系统有哪些?
  • qt如何通过特定字符将字符串拆分写入输入?
  • 结构体实现位段
  • 刷题DAY35
  • LVS--负载均衡调度器
  • windows@共享网络共享打印机@局域网内远程调用打印机打印
  • sql格式化工具
  • [Python办公]常用Python数据采集爬虫技术对比
  • 相机光学(三十七)——自动对焦原理
  • Go语言现代web开发05 指针和结构体
  • Postgresql 删除数组中的元素
  • docker 多服务只暴露一个客户端
  • DFS算法专题(二)——穷举vs暴搜vs深搜vs回溯vs剪枝【OF决策树】
  • Spring Security 快速开始
  • Lua5.3 参考手册
  • Centos如何配置阿里云的yum仓库作为yum源?
  • 力扣139-单词拆分(Java详细题解)
  • CSS —— display属性
  • BTC ETF资金流入暴涨400%,市场下一步将如何发展?
  • 视频监控管理平台LntonAIServer视频智能分析抖动检测算法应用场景
  • 初识php库管理工具composer的体验【爽】使用phpword模板功能替换里面的字符串文本
  • 每日一问:C++ 如何实现继承、封装和多态
  • STM32常用数据采集滤波算法
  • 二分系列(二分查找)9/12
  • 如何通过可视化大屏,助力智慧城市的“城市微脑”建设?
  • 何时空仓库
  • 美创获评CNVD年度原创漏洞发现贡献单位!
  • Spring 循环依赖原理及解决方案
  • 【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147
  • 瑞芯微rv1126 Linux 系统,修改系统时区,包有效方法