使用scrapy编写爬虫并入库Mysql全过程

1、使用pip install scrapy 安装scrapy

2、打开cmd命令行窗口,创建属于自己的爬虫项目工程。命令:scrapy startproject First

3、通过步骤2爬虫工程已经创建完毕,使用pycharm打开,其目录结构如下:

                                              

4、其中spiders文件夹专门用来存放爬虫的文件,items.py用来存储爬虫的数据,middlewares.py用来处理爬虫前的请求和响应,pipelines.py在存储数据前,数据会一次通过管道,进行处理,settings全局爬虫的配置文件,在其中加入数据库的配置信息,scrapy.sfg用于部署爬虫项目到服务器中。

5、再次打开cmd,进入刚才创建的项目spiders底下,输入命令:scrapy genspider jobbole blog.jobbole.com,爬虫文件创建

成功。

                            

6、在方法parase中定义自己的页面解析方式。(css选择器、xpath方式、正则表达式等等都会用在里面)

7、在item.py中定义需要存储一些什么数据,然后在爬虫文件jobbole.py中创建该类的实例对象:jobstart = JoboStartItem()

                                                

然后把解析出的数据一一对应保存,数据名在将来会与数据库中建表时的列名保持一致

                                              

8、这样数据就可以进一步的进入到管道pipeline中进行在处理了,当然保存至mysql数据库,也是在pipeline.py这个文件中完成的。说到将数据保存到数据库就必须谈谈数据的同步保存和异步保存。一般来说数据的入库时间是要远大于爬虫解析网页获取数据的,这就导致,当数据量很大时,数据入库的速度赶不上爬虫爬下来的数据,在同步保存的情况下这就会造成阻塞,导致代码异常报错,而以异常的方式则不会出现这个问题。下面分别介绍在pipeline.py文件中编写这两种处理方式:

同步pipeline:

class MysqlPipeline(object):
    def __init__(self):
        self.conn = MySQLdb.connect('localhost','root','123456','article',charset="utf8", use_unicode=True)
        self.cursor = self.conn.cursor()
    def process_item(self, item, spider):
        insert_sql = """
            insert into info(date,title,url,url_object_id,front_image_url,front_image_path,praise,collect,comment)
            values (%s,%s,%s,%s,%s,%s,%s,%s,%s)
        """
        self.cursor.execute(insert_sql, (item["date"],item["title"],item["url"],item["url_object_id"],
                                         item["front_image_url"],item["front_image_path"],item["praise"],
                                         item["collect"],item["comment"]))
        self.conn.commit()

异步pipeline:

class MysqlTwistedPipepline(object):
    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        param = dict(
            host = settings["MYSQL_HOST"],
            db = settings["MYSQL_DBNAME"],
            user = settings["MYSQL_USER"],
            password = settings["MYSQL_PASSWORD"],
            charset = "utf8",
            cursorclass = MySQLdb.cursors.DictCursor,
            use_unicode = True
        )
        dbpool = adbapi.ConnectionPool("MySQLdb",**param)
        return cls(dbpool)

    def process_item(self, item, spider):
        #使用twisted将mysql插入异步化
        query = self.dbpool.runInteraction(self.do_insert,item)
        query.addErrback(self.handle_error) #处理异常

    def handle_error(self, failure):
        #处理异步插入错误
        print(failure)
    def do_insert(self, cursor, item):
        insert_sql = """
            insert into info(date,title,url,url_object_id,front_image_url,front_image_path,praise,collect,comment)
            values (%s,%s,%s,%s,%s,%s,%s,%s,%s)
        """
        cursor.execute(insert_sql, (item["date"],item["title"],item["url"],item["url_object_id"],
                                         item["front_image_url"],item["front_image_path"],item["praise"],
                                         item["collect"],item["comment"]))

9、写完pipeline后在settings.py进行配置,以上两种方式选择其中的一种即可:

                                

10、RUN:main之后,数据依次入库:




  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值