1首先在setting中配置好数据库的信息,便于修改管理

MYSQL_HOST='192.168.0.2'#主机
MYSQL_DBNAME='dbname'#数据库名称
MYSQL_USER='root'#用户名
MYSQL_PASSWORD='jian'#密码

在pipelines.py中

# Twisted只是提供一个异步容器,本身没提供数据库链接
class MysqlTwistedPipeline(object):
    def __init__(self,dbpool):
        self.dbpool = dbpool
    #从配置中获取信息
    @classmethod
    def from_settings(cls, settings):
        dbparms = dict(
            host=settings["MYSQL_HOST"],
            db=settings['MYSQL_DBNAME'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWORD'],
            charset='utf8',
            cursorclass=MySQLdb.cursors.DictCursor,
            use_unicode=True
        )
        dbpool = adbapi.ConnectionPool("MySQLdb", **dbparms)
        return cls(dbpool)

    def process_item(self, item, spider):
        #使用twisted将mysql插入编程异步执行
        #第一个参数是我们定义的函数
        query = self.dbpool.runInteraction(self.do_insert,item)
        #错误处理
        query.addErrorback(self.handle_error)

    #错误处理函数
    def handle_error(self,falure):
        print(falure)

    def do_insert(self,cursor,item):
        #执行具体的插入
        insert_sql = """
                    insert into jobbole_article(title,create_date,url,url_object_id,front_image_url
                    ,comment_nums,fav_nums,praise_nums,content)
                    VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)
                    """
        cursor.execute(insert_sql, (item['title'], item['create_date'], item['url'], item['url_object_id']
                                         , item['front_image_url'], item['comment_nums']
                                         , item['fav_nums'], item['praise_nums'], item["content"]))


最后一定要在setting中配置

#注,这个方法默认是被注释掉的
ITEM_PIPELINES = {
    'AticleSpider.pipelines.MysqlTwistedPipeline': 1,
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐