UDN-企业互联网技术人气社区

板块导航

浏览  : 5173
回复  : 0

[讨论交流] scrapy爬虫抓取网页写入mysql数据库

[复制链接]
哥屋恩的头像 楼主
发表于 2016-10-11 13:49:52 | 显示全部楼层 |阅读模式
  scrapy抓取的网页默认存成了python的dict结构,scrapy提供了pipeline接口来存储数据,为了方便以后使用,我们把抓取的结构化内容存入mysql

  安装MySQL-python

 
  1.  [root@centos7vm ~]# pip install MySQL-python
复制代码


  执行如下不报错说明安装成功:

  1.   [root@centos7vm ~]# python

  2.   Python 2.7.5 (default, Nov 20 2015, 02:00:19)

  3.   [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2

  4.   Type "help", "copyright", "credits" or "license" for more information.

  5.   >>> import MySQLdb

  6.   >>>
复制代码


  创建page表

  为了保存网页,在mysql数据库中创建page表,sql语句如下:

  1.   CREATE TABLE `page` (

  2.   `id` int(11) NOT NULL AUTO_INCREMENT,

  3.   `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

  4.   `post_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  5.   `post_user` varchar(255) COLLATE utf8_unicode_ci DEFAULT '',

  6.   `body` longtext COLLATE utf8_unicode_ci,

  7.   `content` longtext COLLATE utf8_unicode_ci,

  8.   PRIMARY KEY (`id`),

  9.   UNIQUE KEY `title` (`title`)

  10.   ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
复制代码


  其中title是文章标题,post_date是文章发布时间,post_user是发布者(也就是公众号),body是网页原始内容,content是提取出的纯文本格式的正文

  创建item结构

  在我们的scrapy项目里修改item.py文件,用来保存提取出来的结构化数据,内容如下:

  1.   import scrapy

  2.   class WeixinItem(scrapy.Item):

  3.   # define the fields for your item here like:

  4.   title = scrapy.Field()

  5.   post_date = scrapy.Field()

  6.   post_user = scrapy.Field()

  7.   body = scrapy.Field()

  8.   content = scrapy.Field()
复制代码


  生成item结构

  修改爬虫脚本,在parse函数中增加如下几句:

  1.   def parse_profile(self, response):

  2.   title = response.xpath('//title/text()').extract()[0]

  3.   post_date = response.xpath('//em[@id="post-date"]/text()').extract()[0]

  4.   post_user = response.xpath('//a[@id="post-user"]/text()').extract()[0]

  5.   body = response.body

  6.   tag_content = response.xpath('//div[@id="js_content"]').extract()[0]

  7.   content = remove_tags(tag_content).strip()

  8.   item = WeixinItem()

  9.   item['title'] = title

  10.   item['post_date'] = post_date

  11.   item['post_user'] = post_user

  12.   item['body'] = body

  13.   item['content'] = content

  14.   return item
复制代码


  注:如果不知道爬虫脚本怎么写,请看上一篇文章《教你成为全栈工程师(Full Stack Developer) 三十一-利用微信搜索抓取公众号文章

  另外:这里的content是去标签后的纯文本,使用了remove_tags,这需要加载库:

 
  1.  from w3lib.html import remove_tags
复制代码


  创建pipelines

  scrapy持久化数据的方式是通过pipeline来实现。开源的各种爬虫软件均会对持久化方式提供各种方法,比如pyspider提供了写入mysql、mongodb、文件等的持久化方法,scrapy作为爬虫老将把接口留给了我们,我们可以自定义各种pipeline,同时可以通过配置灵活选择

  pipeline机制通过pipelines.py文件和settings.py文件结合实现

  修改scrapy项目里的pipelines.py内容如下:

  1.   # -*- coding: utf-8 -*-

  2.   import sys

  3.   reload(sys)

  4.   sys.setdefaultencoding('utf8')

  5.   import MySQLdb

  6.   class WeixinPipeline(object):

  7.   def __init__(self):

  8.   self.conn = MySQLdb.connect(host="127.0.0.1",user="myname",passwd="mypasswd",db="mydbname",charset="utf8")

  9.   self.cursor = self.conn.cursor()

  10.   def process_item(self, item, spider):

  11.   sql = "insert ignore into page(title, post_user, body, content) values(%s, %s, %s, %s)"

  12.   param = (item['title'], item['post_user'], item['body'], item['content'])

  13.   self.cursor.execute(sql,param)

  14.   self.conn.commit()
复制代码


  里面的数据库配置按照自己的修改好,这里的process_item会在抓取时自动调用,并把爬虫脚本返回的item通过参数传递进来,这里通过insert将item结构化数据插入了mysql数据库

  下面再看settings.py文件,如下:

  1.   ITEM_PIPELINES = {

  2.   'weixin.pipelines.WeixinPipeline': 300,

  3.   }
复制代码


  运行爬虫后看到数据库如下:

a.png


  相当完美,准备用这些数据来作为训练样本来做机器学习之用,预知后事如何,且听下回分解

原文作者:佚名  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部