Files
tophux_scrape/__pycache__/tophub_scraper.cpython-38.pyc

120 lines
7.7 KiB
Plaintext
Raw Normal View History

U
!<21> i<>&<00>@s<>dZddlZddlmZddlZddlZddlZddlmZddlmZddl Z
ddl m Z e j ddd d
<EFBFBD>Gd d <0C>d <0C>Zed kr<>e<0E>Ze<10><11>dS)un
TopHub网站数据抓取脚本
抓取tophub.today网站上特定xpath元素并存储到SQLite数据库中
<EFBFBD>N)<01>html)<01>datetime)<01>tqdm)<01>loggerztophub_scraper.logz10 MB<4D>INFO)<02>rotation<6F>levelc@sZeZdZdZddd<04>Zdd<06>Zdd<08>Zd d
<EFBFBD>Zd d <0C>Zd d<0E>Z dd<10>Z
dd<12>Z dd<14>Z dS)<17> TopHubScraperuTopHub网站数据抓取器<E58F96>tophub_data.dbcCs@||_d|_d|_d|_t<04><05>|_|jj<07>ddi<01>|<00> <09>dS)ul
初始化抓取器
Args:
db_path (str): SQLite数据库路径
zhttps://tophub.today/z#http://localhost:11434/api/generatezqwen3:8bz
User-AgentzsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36N)
<EFBFBD>db_path<74>base_url<72>api_url<72>
model_name<EFBFBD>requestsZSession<6F>sessionZheaders<72>update<74>_init_database)<02>selfr <00>r<00>QC:\Users\xiaji\Documents\个人文件夹\夏骥\hothub的抓取\tophub_scraper.py<70>__init__s
<02>zTopHubScraper.__init__cCsFt<00>d<01>t<02>|j<04>}|<01><05>}|<02>d<02>|<01><07>|<01><08>t<00>d<03>dS)u$初始化SQLite数据库和表结构u初始化数据库...a
CREATE TABLE IF NOT EXISTS tophub_entries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text_content TEXT NOT NULL,
link TEXT,
category TEXT,
scrape_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
u数据库初始化完成N) r<00>info<66>sqlite3<65>connectr <00>cursor<6F>execute<74>commit<69>close)r<00>connrrrrr+s
 
zTopHubScraper._init_databasec
Cszt<00>d|j<02><00><02>z,|jj|jdd<03>}|<01><05>t<00>d<04>|jWStjk
rt}zt<00> d|<02><00><02><00>W5d}~XYnXdS)u`
获取网页内容
Returns:
str: 网页HTML内容
u正在获取网页内容: <20>
)<01>timeoutu网页内容获取成功u获取网页内容失败: N)
rrr r<00>get<65>raise_for_status<75>textrZRequestException<6F>error)r<00>response<73>errr<00> fetch_webpage@s
zTopHubScraper.fetch_webpagec Cs<>t<00>d<01>t<02>|<01>}|<02>d<02>}g}t|dd<04>D]f}|<05><06><00><07>}d}|<05><08>}|dk r<>|j dkr<>|<08>
dd<08>}|r<>|<07> d <09>s<>d
|<07><00>}|r.|<04> ||d <0B><02>q.t<00>d t |<04><01>d <0A><03>|S)u<>
从HTML内容中提取指定xpath的元素
Args:
html_content (str): HTML内容
Returns:
list: 包含元素文本和链接的字典列表
u正在提取网页元素...z//span[contains(@class, "t")]u提取元素进度<E8BF9B>ZdescN<63>aZhref<65>Zhttpzhttps://tophub.today)r#<00>linku 成功提取 u
个元素)rrrZ
fromstringZxpathr<00> text_content<6E>stripZ getparent<6E>tagr!<00>
startswith<EFBFBD>append<6E>len) r<00> html_contentZtree<65>elements<74>result<6C>elementr,r+<00>parentrrr<00>extract_elementsQs&


  
<02>
zTopHubScraper.extract_elementsc
Cs$d|<01><00>}|j|dd<03>}z<>tj|j|dd<05>}|<04><04>z^|<04><05>}d|krx|d<00><06>}t<07>d|dd <09><00>d
|<06><00><04>|WWSt<07> d |<05><00><02>WWd SWnNtj
k
r<EFBFBD>}z.t<07> d |<07><00><02>t<07> d|j <0C><00><02>WY<00>Wd Sd}~XYnXWn:t k
<EFBFBD>r}zt<07> d|<07><00><02>WY<00>d Sd}~XYnXdS)u<>
使用本地API对文本进行分类
Args:
text (str): 待分类的文本
Returns:
str: 分类结果
u<>目标:对以下文字内容进行分类,返回结果为类别,如"社会新闻""金融""历史""购物"等等。
目的只返回2-4个字不返回其它内容。
内容F)Zmodel<65>prompt<70>stream<61>)<02>jsonr r%u文本 'N<>u...' 分类为: uAPI返回格式异常: u 未分类uJSON解析错误: u响应内容: u分类文本时出错: )rrZpostr r"r;r-r<00>debug<75>warningZJSONDecodeErrorr$r#<00> Exception)rr#r8Zpayloadr%r4<00>categoryr&rrr<00> classify_textvs2
<02><02>  zTopHubScraper.classify_textc Csvt<00>dt|<01><01>d<02><03>t<03>|j<05>}|<02><06>}|D](}|<03>d|d|d|dt<08> <09>f<04>q.|<02>
<EFBFBD>|<02> <0B>t<00>d<07>dS) u<>
将条目保存到数据库
Args:
entries (list): 包含条目信息的字典列表
<20> 正在保存 u 条记录到数据库...<2E><>
INSERT INTO tophub_entries (text_content, link, category, scrape_time)
VALUES (?, ?, ?, ?)
r#r+r@u数据保存完成N<E68890> rrr1rrr rrrZnowrr)rZentriesrr<00>entryrrr<00>save_to_database<73>s <06><02>
zTopHubScraper.save_to_databasec
Cs<>z<>|<00><00>}t<01>d<01>|<00>|<01>}|s2t<01>d<02>WdSt<01>d<04>|<00>|<02>t<01>d<05>g}t|dd<07>D]6}|<00>|d<00>}|<03>|d|d |d
<EFBFBD><03>t <09>
d <0B>q`t<01>d <0C>|<00> |<03>t<01>d <0A>Wn4t k
r<EFBFBD>}zt<01> d|<06><00><02><00>W5d}~XYnXdS)u6
执行完整的抓取和分类流程
u开始提取网页元素...u$未找到任何元素程序结束Nu'保存未分类的数据到数据库...u开始对文本进行分类...u 分类进度r(r#r+)r#r+r@g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?u$更新数据库中的分类信息...u抓取和分类流程完成u执行流程时出错: )r'rrr7r><00>save_unclassified_to_databaserrAr0<00>time<6D>sleep<65>update_categories_in_databaser?r$)rr2r3<00>classified_elementsr5r@r&rrr<00>scrape_and_classify<66>s2





<02> 

z!TopHubScraper.scrape_and_classifyc Csrt<00>dt|<01><01>d<02><03>t<03>|j<05>}|<02><06>}|D]$}|<03>d|d|ddt<08> <09>f<04>q.|<02>
<EFBFBD>|<02> <0B>t<00>d<07>dS) u<>
将未分类的元素保存到数据库
Args:
elements (list): 包含元素信息的字典列表
rBu" 条未分类记录到数据库...rCr#r+u 待分类u未分类数据保存完成NrD)rr3rrr5rrrrG<00>s <06><02>
z+TopHubScraper.save_unclassified_to_databasecCspt<00>dt|<01><01>d<02><03>t<03>|j<05>}|<02><06>}|D]"}|<03>d|d|d|df<03>q.|<02><08>|<02> <09>t<00>d<07>dS) u<>
更新数据库中的分类信息
Args:
classified_elements (list): 包含已分类元素信息的字典列表
u正在更新数据库中 u 条记录的分类信息...u<>
UPDATE tophub_entries
SET category = ?
WHERE text_content = ? AND link = ? AND category = "待分类"
r@r#r+u分类信息更新完成N)
rrr1rrr rrrr)rrKrrr5rrrrJs <06><02>
z+TopHubScraper.update_categories_in_databaseN)r
) <0A>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__rrr'r7rArFrLrGrJrrrrr s
%.,r <00>__main__)rPrZlxmlrrr;rHrrZconcurrent.futuresZ
concurrent<EFBFBD>logurur<00>addr rM<00>scraperrLrrrr<00><module>s