Python中如何使用Scrapy请求Word文件链接并将内容保存到MySQL数据库?
scrapy 如何才能请求 word 文件源链接后返回的内容保存到数据库? 这么描述不知道对不对,就是想通过 scrapy 来把网上的 word 文档直接保存到 mysql 数据库中。 我查询网上说的是可以以二进制形式保存进 mysql 数据库中。
由于爬取的网站需要登录,所以用的 Requset 传递 cookie,但麻烦的是,返回的 response 的 type 是'scrapy.http.response.html.HtmlResponse',并没有 content 属性。那么问题是,返回的 response 如何转换成二进制?
同时,也想问一下,Spider 中模拟登录后一直传递的 cookiejar 怎么才能转换成 request 可以用的 cookie 格式?还是说可以直接拿来用??这个解决了的话,那么我是不是在最后请求 word 文件源链接的时候,用 request 就可以返回 response.content 了??
说的有点乱。。。抱歉
Python中如何使用Scrapy请求Word文件链接并将内容保存到MySQL数据库?
4 回复
求大佬解惑啊
import scrapy
import mysql.connector
import io
from docx import Document
class WordFileSpider(scrapy.Spider):
name = 'wordfile_spider'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 数据库连接配置
self.db_config = {
'host': 'localhost',
'user': 'your_username',
'password': 'your_password',
'database': 'your_database'
}
self.conn = None
self.cursor = None
def start_requests(self):
# 这里替换成你的Word文件URL列表
word_urls = [
'http://example.com/document1.docx',
'http://example.com/document2.docx'
]
for url in word_urls:
yield scrapy.Request(url=url, callback=self.parse_word)
def parse_word(self, response):
# 建立数据库连接
self.conn = mysql.connector.connect(**self.db_config)
self.cursor = self.conn.cursor()
# 创建表(如果不存在)
create_table_sql = """
CREATE TABLE IF NOT EXISTS word_documents (
id INT AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(500),
filename VARCHAR(255),
content LONGTEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
self.cursor.execute(create_table_sql)
# 从URL提取文件名
filename = response.url.split('/')[-1]
# 处理Word文件内容
word_content = self.extract_word_content(response.body)
# 插入数据库
insert_sql = """
INSERT INTO word_documents (url, filename, content)
VALUES (%s, %s, %s)
"""
self.cursor.execute(insert_sql, (response.url, filename, word_content))
self.conn.commit()
# 关闭连接
self.cursor.close()
self.conn.close()
self.logger.info(f"Saved Word file: {filename}")
def extract_word_content(self, word_bytes):
"""提取Word文档的文本内容"""
try:
# 使用内存中的字节流读取Word文件
doc_stream = io.BytesIO(word_bytes)
doc = Document(doc_stream)
# 提取所有段落文本
full_text = []
for paragraph in doc.paragraphs:
if paragraph.text.strip(): # 跳过空段落
full_text.append(paragraph.text)
return '\n'.join(full_text)
except Exception as e:
self.logger.error(f"Error extracting Word content: {e}")
return ""
def close_spider(self, spider):
"""爬虫关闭时清理数据库连接"""
if hasattr(self, 'cursor') and self.cursor:
self.cursor.close()
if hasattr(self, 'conn') and self.conn:
self.conn.close()
# 安装依赖:
# pip install scrapy mysql-connector-python python-docx
# 运行爬虫:
# scrapy runspider word_spider.py
这个方案做了几件事:1)用Scrapy下载Word文件,2)用python-docx解析内容,3)用mysql-connector保存到数据库。记得先装好依赖,配置好数据库连接参数。
核心就是处理好二进制响应和数据库连接。
项目要求的…已经解决了


