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保存到数据库。记得先装好依赖,配置好数据库连接参数。

核心就是处理好二进制响应和数据库连接。

好奇特的需求

项目要求的…已经解决了

回到顶部