インクリメンタルクローラー:名前が示すように、以前にクロールされたクローラーはクロールされず、クロールされていないクローラーはクロールされます。
要件:https
://www.4567kan.com/Analysisでアクションムービーのタイトルと紹介をクロールします:URLを指定し、プロジェクトを作成し、プロジェクトにcdして、クローラーファイルを作成し、リンクエクストラクターがページ番号リンクを抽出し、ルールパーサーがルールを実行します調合、データ分析、永続ストレージは実際には同じです。重要なのは、更新されたムービーのみをクロールする方法です。
コア:映画の詳細ページのURLが以前にクロールされているかどうかをチェック
ストアのURLクロール映画の詳細ページ
Redisの一連のデータ構造(自動重複排除)で
ログインした後にクライアントに:(Redisのデータベーステーブルの空のコマンド: flushall)
保存されたurls:smembers urlsを
表示します保存されたmovieDdata:lrange movieDdata 0-1を表示します
#主文件
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.4567kan.com/index.php/vod/show/id/5/page/1.html']
rules = (
Rule(LinkExtractor(allow=r'\d+.html'), callback='parse_item', follow=True),
)
#创建redis连接对象
conn = Redis(host='127.0.0.1',port=6379)
#用于解析每一个页面中对应的电影详情页url
def parse_item(self, response):
li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
for li in li_list:
detail_url = 'https://www.4567kan.com'+li.xpath('./div/a/@href').extract_first()
#将详情页的url存入redis的set中
ex = self.conn.sadd('urls',detail_url)#urls为了进行对比
if ex==1:
print('该url未被爬取过可进行数据的爬取')
yield scrapy.Request(url=detail_url,callback=self.detail_parse)
else:
print('该url被爬取过 ,无数据可以爬取')
def detail_parse(self,response):
movie_name = response.xpath('/html/body/div[1]/div/div/div/div[2]/h1/text()').extract_first()
jianjie = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
jianjie = ''.join(jianjie)
item = MovieproItem()
item['movie_name'] = movie_name
item['jianjie'] = jianjie
yield item
#items
import scrapy
class MovieproItem(scrapy.Item):
# define the fields for your item here like:
movie_name = scrapy.Field()
jianjie = scrapy.Field()
#pipelines
class MovieproPipeline(object):
conn = None
def open_spider(self,spider):
self.conn = spider.conn #连接对象在爬虫文件(spider)中已经创建过,直接调用
def process_item(self, item, spider):
dic = {
'movie_name':item['movie_name'],
'jianjie':item['jianjie']
}
print(dic)
self.conn.lpush('movieDdata',dic)#存储我们爬取的数据
return item