借鉴了小白进阶之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’实现缓存存储后端的类。
如果基础有不懂的可以去上面的网站去看。