scrapyフレームワークに基づくインクリメンタル爬虫類
2104 ワード
インクリメンタルコンセプト:Webサイトのデータ更新を検出します.最新更新されたデータを取得します. コア:重量除去 レコードテーブル:ストレージの永続化が必要です.redis中set 這い出した情報を記録する 爬取した映画詳細ページのurl:対応するのは深さ爬取 データフィンガープリント:対応する非深さ登り(1ページのデータ更新) データフィンガープリント:データのセットの一意の識別
コード実装:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from moviePro.items import MovieproItem
class MovieSpider(CrawlSpider):
name = 'movie'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://www.4567tv.tv/frim/index1.html']
conn = Redis(host='127.0.0.1',port=6379)
link = LinkExtractor(allow=r'frim/index1-\d+\.html')#
rules = (
Rule(link, callback='parse_item', follow=False),
)
def parse_item(self, response):
# + url
li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
for li in li_list:
name = li.xpath('./div/a/@title').extract_first()
item = MovieproItem()
item['name'] = name
detail_url = 'https://www.4567tv.tv'+li.xpath('./div/a/@href').extract_first()
ex = self.conn.sadd('movie_record',detail_url)
if ex == 1:#
print(' !!!!!!')
yield scrapy.Request(url=detail_url,callback=self.parse_detail,meta={'item':item})
else:
print(' ......')
def parse_detail(self,response):
item = response.meta['item']
desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
item['desc'] = desc
yield item
pipelines.pyファイルのコード:class MovieproPipeline(object):
def process_item(self, item, spider):
conn = spider.conn
conn.lpush('movieData',item)
return item