web.py笔记session

官方的例子

http://webpy.org/cookbook/sessions.zh-cn

 

服务器端有三种方式存session

一种是基本的store ,放在内存里吧

一种是diskstore ,会在code.py同级建一个sessions的文件夹

一种是dbstore,要对应的建一个表,试着改过对应的列的名字,会报错,目前看来也就是这个db的表里面的东西都是固定的

 

 

 create table sessions (
    session_id char(128) UNIQUE NOT NULL,
    atime timestamp NOT NULL default current_timestamp,
    data text
);

 

 

 

测试的结果

 

db.py

   import sqlite3

cx = sqlite3.connect('d:/temp/sessions.db')
cu=cx.cursor()
#cu.execute(''' create table sessions (
    #session_id char(128) UNIQUE NOT NULL,
    #atime timestamp NOT NULL default current_timestamp,
    #data text) 
  #''')
#cx.commit()
cu.execute('select * from sessions')
for i,row in enumerate(cu):
  print i,row
cx.close()
    

 

 code.py

 

import web
import sqlite3
web.config.debug = False
urls = (
    "/count", "count",
    "/reset", "reset"
)
app = web.application(urls, locals())
#store = web.session.DiskStore('sessions')
#session = web.session.Session(app, store, initializer={'count': 0})

db = web.database(dbn='sqlite', db='sessions.db', )
store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'count': 0})

class count:
    def GET(self):
        session.count += 1
        return str(session.count)

class reset:
    def GET(self):
        session.kill()
        store.cleanup(0.002)  #加了个cleanup看效果来着
        return ""

if __name__ == "__main__":
    app.run()

 

真是太简单了,连session都有3种方法可以选,我怎么没记得以前java有这么灵活呢?

不过,不管是读写文件还是数据库,总是比较慢的吧?

 

还有挺奇怪的是reset的时候,不要cleanup一下么?只是kill掉进程的话,不论是文件还是db,都会越来越大的 吧?

真要是本番的话,要不要再写个cron定期清一下?

或者如果真的是本番,根本不会用这2个方法?

 

<think>我们正在整合一个爬虫项目,需要将主函数整合到 `xiaohongshu_spider.py` 文件中。根据引用内容,我们需要注意以下几点: 1. **依赖文件**: - `GenXsAndCommon_56.js`:用于生成小红书签名 `x-s` 和 `x-t` 的 JavaScript 文件,通过 `execjs` 调用。 - `博主id.xlsx`:存储待爬取的博主ID的Excel文件,用于读取博主ID列表。 2. **手动更新 Cookies**: - 在代码中有一个 `cookies_list`,需要手动更新其中的 Cookies 值,特别是 `a1` 值,因为生成签名时需要用到。 3. **其他依赖**: - 根据引用[1],我们使用 `execjs` 来执行 JavaScript 文件生成签名。 - 根据引用[4],我们可能使用 `pandas` 读取 Excel 文件,以及使用 `pymongo` 将数据保存到 MongoDB 数据库(如果需要)。 4. **爬虫流程**: - 引用[2]描述了Scrapy框架的流程,但我们的项目使用的是 `requests` 直接发送请求,因此流程为: 1. 读取Excel文件获取博主ID列表。 2. 对于每个博主,构造请求,生成签名(通过调用JS文件)。 3. 发送请求,解析响应,获取数据。 4. 保存数据(可能是Excel、数据库等)。 ### 整合步骤 #### 1. 确认文件结构 建议将以下文件放在同一目录下: - `xiaohongshu_spider.py`:主爬虫脚本。 - `GenXsAndCommon_56.js`:生成签名的JS文件。 - `博主id.xlsx`:存储博主ID的Excel文件。 #### 2. 手动更新 Cookies 在代码中,需要手动更新 `cookies_list` 变量,例如: ```python cookies_list = [ { &#39;a1&#39;: &#39;你的a1值&#39;, &#39;其他cookie键值对&#39;: &#39;...&#39; }, # 可以准备多个Cookies,用于切换 ] ``` #### 3. 主函数整合 将主函数 `main` 整合到 `xiaohongshu_spider.py` 中,并包含以下功能: - 读取Excel文件(使用`pandas`) - 遍历博主ID - 调用JS生成签名(使用`execjs`) - 发送请求 - 解析和保存数据 #### 4. 代码示例 以下是整合后的代码框架: ```python import pandas as pd import execjs import requests import time import random import os from pymongo import MongoClient # 如果使用MongoDB保存数据 def update_headers(api, data, current_cookies): """使用 execjs 执行 JS 文件生成 x-s, x-t 签名""" with open(&#39;GenXsAndCommon_56.js&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f: js_script = f.read() context = execjs.compile(js_script) sign = context.call(&#39;getXs&#39;, api, data, current_cookies[&#39;a1&#39;]) return sign def get_notes(blogger_id, cookies): """获取博主笔记列表""" # 构造请求的API和参数 api = &#39;/api/sns/web/v1/user_posted&#39; data = { &#39;user_id&#39;: blogger_id, &#39;cursor&#39;: &#39;&#39;, &#39;num&#39;: 20 # 每次请求的数量 } # 生成签名 sign_dict = update_headers(api, data, cookies) headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&#39;, &#39;Cookie&#39;: f"a1={cookies[&#39;a1&#39;]}; ...", # 构造完整的Cookie字符串 &#39;X-S&#39;: sign_dict[&#39;X-s&#39;], &#39;X-T&#39;: str(sign_dict[&#39;X-t&#39;]) } # 发送请求 url = f&#39;https://edith.xiaohongshu.com{api}&#39; response = requests.post(url, json=data, headers=headers) # 处理响应 if response.status_code == 200: return response.json() else: print(f"请求失败,状态码:{response.status_code}") return None def save_to_mongo(data): """保存数据到MongoDB""" client = MongoClient(&#39;mongodb://localhost:27017/&#39;) db = client[&#39;xiaohongshu&#39;] collection = db[&#39;notes&#39;] collection.insert_one(data) def main(): # 读取博主ID列表 file_path = &#39;博主id.xlsx&#39; if not os.path.exists(file_path): print(f"文件不存在: {file_path}") return data = pd.read_excel(file_path) blogger_ids = data[&#39;博主id&#39;].tolist() # 假设Excel中有一列名为&#39;博主id&#39; # 手动设置Cookies列表(需要提前更新) cookies_list = [ {&#39;a1&#39;: &#39;your_a1_value_here&#39;, &#39;other_cookie&#39;: &#39;value&#39;}, # ... 多个Cookies ] for blogger_id in blogger_ids: # 随机选择一个Cookies cookies = random.choice(cookies_list) try: notes_data = get_notes(blogger_id, cookies) if notes_data: # 解析数据并保存 # ... 这里根据实际返回数据结构进行解析 # 保存到MongoDB save_to_mongo(notes_data) print(f"博主 {blogger_id} 的数据保存成功") # 随机休眠,避免请求过快 time.sleep(random.uniform(1, 3)) except Exception as e: print(f"处理博主 {blogger_id} 时出错: {e}") if __name__ == &#39;__main__&#39;: main() ``` #### 5. 注意事项 - **文件路径**:确保 `GenXsAndCommon_56.js` 和 `博主id.xlsx` 与脚本在同一目录,或者使用正确的相对/绝对路径。 - **异常处理**:添加了文件存在性检查,避免 `FileNotFoundError`。 - **Cookies更新**:需要用户手动更新 `cookies_list` 中的值,特别是 `a1`。 - **数据保存**:示例中使用了MongoDB,也可以根据引用[4]使用pandas导出Excel。 ### 相关问题 1. 如何获取小红书爬虫所需的 Cookies(特别是 a1 值)? 2. 如何解决小红书签名 JS 文件(如 `GenXsAndCommon_56.js`)的更新问题? 3. 除了博主笔记,如何扩展爬虫以抓取小红书评论、点赞等数据? 4. 如何动态切换多个 Cookies 以避免反爬虫限制? 5. 使用 MongoDB 存储爬虫数据时,如何设计数据集合(Collection)结构?</think>### 整合小红书爬虫项目的依赖文件与资源 根据您的需求,我将详细说明将主函数整合到 `xiaohongshu_spider.py` 文件所需的依赖文件和资源,以及如何手动更新 Cookies。 --- ### 一、核心依赖文件与资源 #### 1. **JavaScript 签名文件** - **文件路径**: `GenXsAndCommon_56.js` - **作用**: 生成小红书接口所需的 `x-s` 和 `x-t` 签名参数[^1] - **调用方式**: ```python def update_headers(api, data, current_cookies): with open(&#39;GenXsAndCommon_56.js&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f: js_script = f.read() context = execjs.compile(js_script) sign = context.call(&#39;getXs&#39;, api, data, current_cookies[&#39;a1&#39;]) return sign # 返回包含 &#39;X-s&#39;, &#39;X-t&#39; 的字典 ``` #### 2. **博主 ID 数据文件** - **文件路径**: `博主id.xlsx` - **作用**: 存储待爬取的博主 ID 列表 - **读取方式**: ```python import pandas as pd data = pd.read_excel(&#39;博主id.xlsx&#39;) blogger_ids = data[&#39;博主ID列名&#39;].tolist() # 替换为实际列名 ``` #### 3. **Cookies 配置文件** - **手动更新位置**: ```python cookies_list = [ { &#39;a1&#39;: &#39;需手动更新的a1值&#39;, &#39;web_session&#39;: &#39;需手动更新的session值&#39;, &#39;其他cookies字段&#39;: &#39;值&#39; }, # 可配置多个Cookies账号 ] ``` - **获取方式**: 1. 浏览器登录小红书账号 2. 打开开发者工具(F12)→ Application → Cookies 3. 复制 `a1` 和 `web_session` 等关键字段值 #### 4. **数据库配置文件(可选)** - **文件路径**: `config.py` - **内容示例**: ```python MONGO_URL = &#39;mongodb://localhost:27017/&#39; MONGO_DB = &#39;xiaohongshu&#39; MONGO_COLLECTION = &#39;user_notes&#39; ``` --- ### 二、完整文件整合结构 ``` 项目目录/ ├── xiaohongshu_spider.py # 主爬虫脚本 ├── GenXsAndCommon_56.js # 签名生成JS ├── 博主id.xlsx # 博主ID数据 ├── config.py # 数据库配置 └── requirements.txt # Python依赖库 ``` #### `xiaohongshu_spider.py` 核心结构: ```python import pandas as pd import execjs import requests import time import random from pymongo import MongoClient # 若使用MongoDB from config import MONGO_URL, MONGO_DB, MONGO_COLLECTION # 数据库配置 # 1. 签名生成函数 def update_headers(api, data, current_cookies): # ... [同上] ... # 2. 数据保存函数 def save_to_mongo(data): client = MongoClient(MONGO_URL) db = client[MONGO_DB] collection = db[MONGO_COLLECTION] collection.insert_one(data) # 3. 主爬虫逻辑 def get_blogger_notes(blogger_id, cookies): api = &#39;/api/sns/web/v1/user_posted&#39; params = {&#39;user_id&#39;: blogger_id, &#39;cursor&#39;: &#39;&#39;} # 生成签名 sign = update_headers(api, params, cookies) headers = { &#39;X-s&#39;: sign[&#39;X-s&#39;], &#39;X-t&#39;: str(sign[&#39;X-t&#39;]), &#39;Cookie&#39;: f"a1={cookies[&#39;a1&#39;]}; web_session={cookies[&#39;web_session&#39;]}" } # 发送请求 response = requests.get( f&#39;https://www.xiaohongshu.com{api}&#39;, params=params, headers=headers ) return response.json() # 4. 主函数 def main(): # 读取博主ID df = pd.read_excel(&#39;博主id.xlsx&#39;) blogger_ids = df[&#39;id&#39;].tolist() # 手动配置的Cookies cookies_list = [...] # 需手动更新 for blogger_id in blogger_ids: cookies = random.choice(cookies_list) # 随机选择Cookies data = get_blogger_notes(blogger_id, cookies) # 保存数据 (MongoDB示例) save_to_mongo({ &#39;blogger_id&#39;: blogger_id, &#39;notes&#39;: data[&#39;data&#39;][&#39;notes&#39;] }) time.sleep(random.uniform(1, 3)) # 随机延迟 if __name__ == "__main__": main() ``` --- ### 三、手动更新 Cookies 的步骤 1. **获取最新 Cookies**: - 登录小红书网页版 → F12 打开开发者工具 - 切换到 Network 标签 → 刷新页面 - 点击任意请求 → 复制 Request Headers 中的 `Cookie` 值 2. **更新配置**: ```python cookies_list = [ { &#39;a1&#39;: &#39;18a7f5a7b7aw8ef8...&#39;, # 替换为新值 &#39;web_session&#39;: &#39;040069b0a0a0e...&#39;, # 替换为新值 &#39;其他字段&#39;: &#39;值&#39; }, # 可添加多个账号 ] ``` 3. **注意事项**: - Cookies 有效期通常为 **1-7天**,需定期更新 - 多账号配置可避免频繁请求被封禁 - 使用 `random.choice(cookies_list)` 实现账号轮换 --- ### 四、运行环境准备 1. **安装依赖库**: ```bash pip install pandas execjs requests pymongo openpyxl ``` 2. **安装 JavaScript 环境**: - Windows: 安装 [Node.js](https://nodejs.org/) - Linux/Mac: `sudo apt install nodejs` --- ### 相关问题 1. 如何验证小红书签名算法 `getXs` 是否失效?失效后如何更新?[^1] 2. 当 Cookies 失效时,如何实现自动登录刷新机制? 3. 如何将 MongoDB 中的数据导出为 Excel 文件?[^4] 4. 如何设计分布式爬虫架构应对小红书的反爬策略? 5. 使用 `requests.Session` 管理 Cookies 有哪些优势?[^3] 通过以上整合,您的 `xiaohongshu_spider.py` 将具备完整的爬取功能,只需定期手动更新 Cookies 即可持续运行。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值