scrapy目录结构如下
我们要爬取的是读书网里面的书名,作者,和对书的描写
首先我们要定义爬取数据的模型,在items.py文件中
import scrapy
class MoveItem(scrapy.Item):
# 定义爬取的数据的模型
title = scrapy.Field()
auth = scrapy.Field()
desc = scrapy.Field()
主要的还是spiders目录下的move.py文件
import scrapy
from douban.items import MoveItem
class MovieSpider(scrapy.Spider):
# 表示蜘蛛的名字,每个蜘蛛的名字必须是唯一的
name = 'movie'
# 表示过滤爬取的域名
allwed_domians = ['dushu.com']
# 表示最初要爬取的url
start_urls = ['https://www.dushu.com/book/1188.html']
def parse(self,response):
li_list = response.xpath('/html/body/div[6]/div/div[2]/div[2]/ul/li')
for li in li_list:
item = MoveItem()
item['title'] = li.xpath('div/h3/a/text()').extract_first()
item['auth'] = li.xpath('div/p[1]/a/text()').extract_first()
item['desc'] = li.xpath('div/p[2]/text()').extract_first()
# 生成器
yield item
href_list = response.xpath('/html/body/div[6]/div/div[2]/div[3]/div/a/@href').extract()
for href in href_list:
# 把在页面上爬取的url补全
url = response.urljoin(href)
# 一个生成器,response的里面链接,再进行子request,不断执行parse,是个递归。
yield scrapy.Request(url=url,callback=self.parse)
想要持久化数据只有把数据保存起来:在settings.py文件里设置
在pipelines.py文件里:
import pymongo
class DoubanPipeline(object):
def __init__(self):
self.mongo_client = pymongo.MongoClient('mongodb://39.108.188.19:27017')
def process_item(self, item, spider):
db = self.mongo_client.data
message = db.messages
message.insert(dict(item))
return item