【python】使用requests多线程爬取论坛文章并存储在sqlite中
import requests
import re
import threading
import sqlite3
from contextlib import closing
# 定义爬虫类
class Crawler(threading.Thread):
def __init__(self, url, conn):
threading.Thread.__init__(self)
self.url = url
self.conn = conn
self.headers = {
'User-Agent': 'Mozilla/5.0',
'Accept-Encoding': 'gzip, deflate',
}
# 定义爬取单个页面的方法
def crawl_page(self, url):
print(f"Crawling: {url}")
response = requests.get(url, headers=self.headers)
if response.status_code == 200:
return self.parse_page(response.text)
return []
# 定义解析页面的方法
def parse_page(self, html):
pattern = re.compile(r'<a href="(?P<url>.*?)".*?>(?P<title>.*?)</a>', re.DOTALL)
matches = pattern.finditer(html)
return [(match.group('title'), f"http://example.com{match.group('url')}") for match in matches]
# 定义存储数据的方法
def store_data(self, data):
with self.conn:
self.conn.executemany('INSERT OR IGNORE INTO articles (title, url) VALUES (?, ?)', data)
# 定义运行线程的方法
def run(self):
data = self.crawl_page(self.url)
self.store_data(data)
# 创建SQLite数据库连接
conn = sqlite3.connect('articles.sqlite')
conn.execute('CREATE TABLE IF NOT EXISTS articles (id INTEGER PRIMARY KEY, title TEXT, url TEXT)')
# 定义要爬取的URL
urls = ['http://example.com/page1', 'http://example.com/page2']
# 创建爬虫线程
threads = [Crawler(url, conn) for url in urls]
# 启动线程
for t in threads:
t.start()
# 等待所有线程完成
for t in threads:
t.join()
# 关闭数据库连接
conn.close()
print("Crawling completed!")
这段代码修复了原代码的逻辑错误,并添加了对应的注释。它定义了一个Crawler类,该类继承自threading.Thread,用于多线程爬取网页。每个线程都会爬取指定的URL,解析页面,提取文章标题和URL,并将它们存储到SQLite数据库中。这个例子展示了如何使用Python的requests库、re模块、threading模块和sqlite3模块来进行基本的网络爬虫和数据存储工作。
评论已关闭