scrapy爬虫_scrapy + mogoDB 网站爬虫

工具环境

语言:python3.6数据库:MongoDB (安装及运行命令如下)

python3 -m pip install pymongobrew install mongodbmongod --config /usr/local/etc/mongod.conf

框架:scrapy1.5.1 (安装命令如下)

python3 -m pip install Scrapy

用 scrapy 框架创建一个爬虫项目

在终端执行如下命令,创建一个名为 myspider 的爬虫项目

scrapy startproject myspider

即可得到一个如下结构的文件目录

cfa06b83d83c37447320e681caa142ba.png

创建 crawl 样式的爬虫

针对不同的用途, scrapy 提供了不同种类的爬虫类型,分别是Spider:所有爬虫的祖宗CrawlSpider:比较常用的爬取整站数据的爬虫(下面的例子就是用这种)XMLFeedSpiderCSVFeedSpiderSitemapSpider

先在命令行进入到 spiders 目录下

cd myspider/myspider/spiders

然后创建 crawl 类型的爬虫模板

scrapy genspider -t crawl zgmlxc www.zgmlxc.com.cn

参数说明:

-t crawl 指明爬虫的类型

zgmlxc 是我给这个爬虫取的名字

www.zgmlxc.com.cn 是我要爬取的站点

完善小爬虫 zgmlxc

打开 zgmlxc.py 文件,可以看到一个基本的爬虫模板,现在就开始对其进行一系列的配置工作,让这个小爬虫根据我的指令去爬取信息。

配置跟踪页面规则

rules = (    // 定位到 www.zgmlxc.com.cn/node/72.jspx 这个页面    Rule(LinkExtractor(allow=r'.72.jspx')),      // 在上面规定的页面中,寻找符合下面规则的 url, 爬取里面的内容,并把获取的信息返回给 parse_item()函数    Rule(LinkExtractor(allow=r'./info/d+.jspx'), callback='parse_item'),)        

这里有个小坑,就是最后一个 Rule 后面必须有逗号,否则报错,哈哈哈

rules = ( Rule(LinkExtractor(allow=r'./info/d+.jspx'), callback='parse_item', follow=True), )

在 items.py 内定义我们需要提取的字段

import scrapyclass CrawlspiderItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    title = scrapy.Field()    content = scrapy.Field()    piclist = scrapy.Field()    shortname = scrapy.Field()

完善 parse_item 函数

这里就是把上一步返回的内容,配置规则,提取我们想要的信息。这里必须用 join 方法,是为了方便后面顺利导入数据库。

def parse_item(self, response):    yield {        'title' : ' '.join(response.xpath("//div[@class='head']/h3/text()").get()).strip(),        'shortname' : ' '.join(response.xpath("//div[@class='body']/p/strong/text()").get()).strip(),        'piclist' : ' '.join(response.xpath("//div[@class='body']/p/img/@src").getall()).strip(),        'content' : ' '.join(response.css("div.body").extract()).strip(),            }

PS: 下面是提取内容的常用规则,直接总结在这里了:

1). 获取 img 标签中的 src://img[@class='photo-large']/@src

2). 获取文章主题内容及排版:response.css("div.body").extract()

将信息存入 MogoDB 数据库

设置数据库信息

打开 settings.py 添加如下信息:

# 建立爬虫与数据库之间的连接关系ITEM_PIPELINES = {   'crawlspider.pipelines.MongoDBPipeline': 300,}# 设置数据库信息MONGODB_SERVER = "localhost"MONGODB_PORT = 27017MONGODB_DB = 'spider_world'MONGODB_COLLECTION = 'zgmlxc'# 设置文明爬虫, 意思是每个请求之间间歇 5 秒, 对站点友好, 也防止被黑名单```pyDOWNLOAD_DELAY = 5

在 piplines.py 中

import pymongofrom scrapy.conf import settingsfrom scrapy.exceptions import DropItemfrom scrapy import logclass MongoDBPipeline(object):    def __init__(self):        connection = pymongo.MongoClient(            settings['MONGODB_SERVER'],            settings['MONGODB_PORT']        )        db = connection[settings['MONGODB_DB']]        self.collection = db[settings['MONGODB_COLLECTION']]    def process_item(self, item, spider):        valid = True        for data in item:            if not data:                valid = False                raise DropItem("Missing {0}!".format(data))        if valid:            self.collection.insert(dict(item))            log.msg("Question added to MongoDB database!",                    level=log.DEBUG, spider=spider)        return item

在终端运行这个小爬虫

scrapy crawl myspider

在 navicat 中查看信息入库情况

如下图新建一个 MogoDB 的数据库连接,填入上面配置的信息,如果一切顺利, 就可以看到我们想要的信息都已经入库了。

12dd6b07feeb16ee640f9d559c094a89.png

以上就完成了自定义爬虫到数据入库的全过程

更多精彩文章可关注公众号python社区营获取相关资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 Scrapy 和 MongoDB 的简单示例,它将取豆瓣电影 Top 250 的数据并存储到 MongoDB 数据库: 1. 安装 Scrapy 和 pymongo: ``` pip install scrapy pymongo ``` 2. 创建 Scrapy 项目: ``` scrapy startproject douban ``` 3. 在 `settings.py` 文件配置 MongoDB: ``` MONGODB_HOST = 'localhost' MONGODB_PORT = 27017 MONGODB_DBNAME = 'douban' MONGODB_COLLECTION = 'movies' ``` 4. 创建一个名为 `items.py` 的文件,定义要取的数据字段: ``` import scrapy class DoubanItem(scrapy.Item): title = scrapy.Field() rating = scrapy.Field() director = scrapy.Field() actors = scrapy.Field() year = scrapy.Field() country = scrapy.Field() category = scrapy.Field() ``` 5. 创建一个名为 `douban_spider.py` 的文件,定义爬虫: ``` import scrapy from douban.items import DoubanItem from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class DoubanSpider(CrawlSpider): name = 'douban' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] rules = ( Rule(LinkExtractor(allow=('subject/\d+/$')), callback='parse_item'), Rule(LinkExtractor(allow=('top250\?start=\d+')), follow=True) ) def parse_item(self, response): item = DoubanItem() item['title'] = response.css('h1 span::text').get() item['rating'] = response.css('strong.rating_num::text').get() item['director'] = response.css('a[rel="v:directedBy"]::text').get() item['actors'] = response.css('a[rel="v:starring"]::text').getall() item['year'] = response.css('span.year::text').get() item['country'] = response.css('span[property="v:initialReleaseDate"]::text').re_first(r'(\S+)\s+\(\S+\)') item['category'] = response.css('span[property="v:genre"]::text').getall() yield item ``` 6. 运行爬虫: ``` scrapy crawl douban ``` 7. 在 MongoDB 查看数据: ``` > use douban > db.movies.find().pretty() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值