🗣 Wd提问: 爬虫源码mysql存储
🤖 Ai回答: Python爬虫源码:MySQL存储实现
下面是一个完整的Python爬虫示例,将爬取的数据存储到MySQL数据库。这个示例使用了`requests`、`BeautifulSoup`进行爬取,`pymysql`进行数据库操作。
1、环境准备
首先安装必要的库:
bash
pip install requests beautifulsoup4 pymysql
2、MySQL数据库设置
创建数据库和表的SQL脚本:
sql
CREATE DATABASE IF NOT EXISTS spider_db;
USE spider_db;
CREATE TABLE IF NOT EXISTS news (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
url VARCHAR(512) NOT NULL,
summary TEXT,
crawled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3、爬虫源码
python
import requests
from bs4 import BeautifulSoup
import pymysql
import time
import logging
from urllib.parse import urljoin
配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
filename='spider.log'
)
class NewsSpider:
def __init__(self, db_config):
初始化爬虫
:param db_config: 数据库配置字典
self.db_config = db_config
self.conn = None
self.cursor = None
self.base_url = https://65.hk 替换为目标网站的根URL
def connect_db(self):
连接到MySQL数据库
try:
self.conn = pymysql.connect(
host=self.db_config['host'],
port=self.db_config['port'],
user=self.db_config['user'],
password=self.db_config['password'],
database=self.db_config['database'],
charset='utf8mb4'
)
self.cursor = self.conn.cursor()
logging.info(数据库连接成功)
except Exception as e:
logging.error(f数据库连接失败: {str(e)})
raise
def close_db(self):
关闭数据库连接
if self.cursor:
self.cursor.close()
if self.conn:
self.conn.close()
logging.info(数据库连接已关闭)
def create_table(self):
创建数据表(如果不存在)
create_table_sql =
CREATE TABLE IF NOT EXISTS news (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
url VARCHAR(512) NOT NULL,
summary TEXT,
crawled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
try:
self.cursor.execute(create_table_sql)
self.conn.commit()
logging.info(数据表创建成功或已存在)
except Exception as e:
logging.error(f创建数据表失败: {str(e)})
raise
def insert_news(self, title, url, summary):
插入新闻数据到数据库
insert_sql =
INSERT INTO news (title, url, summary)
VALUES (%s, %s, %s)
try:
self.cursor.execute(insert_sql, (title, url, summary))
self.conn.commit()
logging.info(f成功插入新闻: {title})
except Exception as e:
logging.error(f插入数据失败: {str(e)})
self.conn.rollback()
def get_news_list(self):
从目标网站获取新闻列表
try:
发送请求获取页面
response = requests.get(
self.base_url + /news,
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
)
response.encoding = 'utf-8'
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
根据实际网页结构调整选择器
以下为示例,需要根据目标网站调整
news_items = soup.select('.news-item')
news_list = []
for item in news_items:
提取标题
title_tag = item.select_one('.news-title')
title = title_tag.text.strip() if title_tag else 无标题
提取链接(可能是相对路径,需要转换为绝对路径)
link_tag = item.select_one('.news-title')
url = urljoin(self.base_url, link_tag['href']) if link_tag and 'href' in link_tag.attrs else
提取摘要
summary_tag = item.select_one('.news-summary')
summary = summary_tag.text.strip() if summary_tag else 无摘要
news_list.append({
'title': title,
'url': url,
'summary': summary
})
return news_list
else:
logging.error(f请求失败,状态码: {response.status_code})
return []
except Exception as e:
logging.error(f获取新闻列表出错: {str(e)})
return []
def crawl(self):
执行爬虫任务
logging.info(开始爬取新闻...)
try:
news_list = self.get_news_list()
for news in news_list:
self.insert_news(news['title'], news['url'], news['summary'])
添加请求间隔,避免对目标网站造成过大压力
time.sleep(1)
logging.info(f成功爬取 {len(news_list)} 条新闻)
except Exception as e:
logging.error(f爬虫执行出错: {str(e)})
raise
def run(self):
运行爬虫
try:
self.connect_db()
self.create_table()
self.crawl()
finally:
self.close_db()
if __name__ == __main__:
配置数据库信息
db_config = {
'host': 'localhost',
'port': 3306,
'user': 'root', 替换为你的MySQL用户名
'password': 'your_password', 替换为你的MySQL密码
'database': 'spider_db'
}
创建并运行爬虫
spider = NewsSpider(db_config)
spider.run()
4、使用说明
1、修改数据库配置:
将`db_config`中的`user`、`password`替换为你的MySQL实际配置
2、调整目标网站:
修改`base_url`为要爬取的网站根URL
根据目标网站的HTML结构调整`get_news_list`中的选择器(`.news-item`、`.news-title`等)
3、运行爬虫:
bash
python spider.py
4、查看日志:
爬虫会生成`spider.log`文件,记录详细执行过程
5、重要注意事项
1、遵守robots.txt:
在爬取前,先查看目标网站的`robots.txt`文件,确保爬取行为符合网站规定
例如:`https://65.hk/robots.txt`
2、请求间隔:
代码中设置了`time.sleep(1)`,避免爬取过于频繁
根据目标网站的承受能力调整间隔时间
3、错误处理:
代码包含了基本的错误处理和日志记录
对于生产环境,建议添加更完善的异常处理和重试机制
4、数据存储:
使用参数化查询防止SQL注入
使用`utf8mb4`字符集支持存储表情符号
6、扩展建议
1、分页爬取:
如果网站有分页,需要添加分页处理逻辑
2、代理IP:
对于需要IP轮换的网站,可以添加代理IP池
3、多线程/异步:
对于大规模爬取,可以考虑使用多线程或异步IO提高效率
4、数据去重:
添加检查重复URL的逻辑,避免重复存储
5、进度跟踪:
添加爬取进度显示,方便监控
7、针对特定网站的调整
如果要爬取其他网站,需要根据其HTML结构调整以下部分:
python
在get_news_list方法中调整选择器
news_items = soup.select('.news-item') 需要根据实际网站调整
提取标题
title_tag = item.select_one('.news-title') 需要根据实际网站调整
提取链接
link_tag = item.select_one('.news-title')
url = urljoin(self.base_url, link_tag['href']) 修正相对URL
请根据目标网站的实际HTML结构修改这些选择器。
这个示例提供了一个完整的爬虫框架,你可以根据实际需求进行调整和扩展。记住,爬取网络数据时务必遵守法律和道德规范,尊重网站的爬取规则。
📣 商家广告 :
👍
0
👎
IP地址: 249.171.111.41
搜索次数: 0
提问时间: 2025-11-11 06:24:08
🛒 域名购买 :
53.biz 05.gold 219.net.cn cisou.com.cn dk.gs t-v.com.cn chang.net.cn 6.hn.cn lr.gs ff.biz
❓️ 热门提问 :
长沙学习云计算培训 香港染发剂哪个牌子好吗 南昌vps 网站优化谷歌 docker是云计算吗 php 文件上传 413 错误 拨号服务器的搭建 瑜伽馆源码定制 河南云主机 vps免备案服务器搭建lnmp 豌豆Ai站群搜索引擎系统
🌐 域名评估 :
kimi.beauty yd.cq.cn 5.hi.cn an.cq.cn vv.xz.cn yu7.sn.cn su.tw.cn vpkr.cn yu7.jl.cn uu.ah.cn
⛏ 最新挖掘 :
凯里酸汤鱼 贵阳烤脑花 都匀毛尖茶 花溪牛肉粉 贵阳烤生蚝 贵阳烤豆腐 贵阳纸包鱼 贵阳特色菜
🖌 热门作画 :
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊 :
🔗 友情链接 :
検索エンジンの開発
货淋室价格
ai提问
🧰 站长工具 :Ai工具 whois查询 搜索
📢 温馨提示 :本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持 :本站由豌豆Ai 提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。