scrapy+mongodb爬取红袖天香

借鉴了小白进阶之Scrapy第一篇
先来定义字段
items.py

import scrapy


class HxtxItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    author=scrapy.Field()
    novelurl=scrapy.Field()#小说地址
    serialstatus=scrapy.Field()#小说状态
    serialnumber=scrapy.Field()#小说字数
    category=scrapy.Field()#文章类别
    introduction=scrapy.Field()#小说简介
    information=scrapy.Field()#小说信息

编写spider
spiders/spider.py

#coding=utf-8
import scrapy
import re
from HXTX.items import HxtxItem

class Myspider(scrapy.Spider):
    name='HXTX'
    allowed_domains=['hongxiu.com']
    bash_url='http://www.hongxiu.com/novel/s/'
    bashurl='.html'

    def start_requests(self):
        for i in range(1,12):
            url=self.bash_url+str(i)+'_1'+self.bashurl
            yield scrapy.Request(url,self.parse)

    def parse(self,response):#爬取书的地址
        try:
            if re.match('.*?s/\d_1.*?',response.url):
                href=response.xpath('//ul[@id="htmlPage"]/li[@class="np"]/a/@href')[0]
            else:
                href=response.xpath('//ul[@id="htmlPage"]/li[@class="np"]/a/@href')[1]
        except:
            href=response.xpath('//ul[@id="htmlPage"]/li[@class="np"]/a/@href')[0]
        url=response.urljoin(href.extract())
        yield scrapy.Request(url,callback=self.parse)

        temp=0
        for h in response.xpath('//div[@class="name"]/strong/a'):
            novelname=h.xpath('text()').extract()
            novelurl=h.xpath('@href').extract()[0]
            num=response.xpath('//div[@class="num"]/span/text()').extract()[temp]
            temp+=4
            yield scrapy.Request(novelurl,callback=self.get_book,meta={'name':novelname,'url':novelurl,'num':num})

    def get_book(self,response):
        item=HxtxItem()
        item['name']=response.meta['name']
        item['novelurl']=response.meta['url']
        item['author']=response.xpath('//span[@class="weizhist"]/a/text()').extract()
        item['serialstatus']=response.xpath('//div[@class="txt"]/p/text()').extract()
        item['category']=response.xpath('//span[@id="htmlpos"]/a/text()').extract()[0]
        item['introduction']=response.xpath('//div[@class="con_text"]/h3/text()').extract()
        item['information']=response.xpath('//div[@class="con_text"]/div[@class="qh_info zp_jj none"]/ul').xpath('string(.)').extract()
        item['serialnumber']=response.meta['num']
        return item

使用mongodb存储
pipelines.py

import pymongo

from scrapy.conf import settings
from scrapy.exceptions import DropItem
from scrapy import log

class HxtxPipeline(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):
        for data in item:
            if not data:
                raise DropItem("Missing {0}!".format(data))
        self.collection.update({'serialstatus':item['serialstatus'],'serialnumber':item['serialnumber']},dict(item),upsert=True)
        log.msg("Data added to MongoDB database!",level=log.DEBUG,spider=spider)
        return item

settings.py

ITEM_PIPELINES = {
    'HXTX.pipelines.HxtxPipeline': 300,
}
MONGODB_SERVER="localhost"
MONGODB_PORT=27017
MONGODB_DB="HXTX"
MONGODB_COLLECTION="book"
...
#开启缓存
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = []
HTTPCACHE_STORAGE='scrapy.extensions.httpcache.FilesystemCacheStorage'

HTTPCache中间件设置

HttpCacheMiddleware 可以通过以下设置进行配置:

  • HTTPCACHE_ENABLED
    0.11 新版功能.

    默认: False

    HTTP缓存是否开启。

    在 0.11 版更改: 在0.11版本前,是使用 HTTPCACHE_DIR 来开启缓存。

  • HTTPCACHE_EXPIRATION_SECS 默认: 0

    缓存的request的超时时间,单位秒。

    超过这个时间的缓存request将会被重新下载。如果为0,则缓存的request将永远不会超时。

    在 0.11 版更改: 在0.11版本前,0的意义是缓存的request永远超时。

  • HTTPCACHE_DIR 默认: ‘httpcache’

    存储(底层的)HTTP缓存的目录。如果为空,则HTTP缓存将会被关闭。 如果为相对目录,则相对于项目数据目录(project data
    dir)。更多内容请参考 默认的Scrapy项目结构 。

  • HTTPCACHE_IGNORE_HTTP_CODES
    0.10 新版功能.

    默认: []

    不缓存设置中的HTTP返回值(code)的request。

  • HTTPCACHE_IGNORE_MISSING 默认: False

    如果启用,在缓存中没找到的request将会被忽略,不下载。

  • HTTPCACHE_IGNORE_SCHEMES
    0.10 新版功能.

    默认: [‘file’]

    不缓存这些URI标准(scheme)的response。

  • HTTPCACHE_STORAGE 默认:
    ‘scrapy.extensions.httpcache.FilesystemCacheStorage’

    实现缓存存储后端的类。

如果基础有不懂的可以去上面的网站去看。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 ScrapyMongoDB 的简单示例,它将爬取豆瓣电影 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、付费专栏及课程。

余额充值