日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

RedisCrawlSpider爬取当当图书信息

發(fā)布時(shí)間:2023/12/31 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RedisCrawlSpider爬取当当图书信息 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先查看以下當(dāng)當(dāng)網(wǎng)的頁(yè)面結(jié)構(gòu),可以看到的是圖書(shū)的大小分類(lèi)都在class="con flq_body"的div中。記得要看看頁(yè)面源代碼中是否有這些數(shù)據(jù)噢

然后可以看到所有小分類(lèi)的鏈接都在class="inner dl"的dl標(biāo)簽中,所以使用link_extractor可以直接提取,再到詳情頁(yè)面獲取大小分類(lèi)。
然后將下一頁(yè)的鏈接也提取出來(lái),這樣就可以獲取到所有的數(shù)據(jù)咯

具體分析已經(jīng)做完就可以開(kāi)始敲代碼,首先開(kāi)始寫(xiě)一個(gè)crawlspider文件。可以自己寫(xiě)import,如果嫌麻煩可以直接使用cmd創(chuàng)建

from scrapy.spiders import Rule from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpiderclass SpiderSpider(CrawlSpider):name = 'dd_book'allowed_domains = ['dangdang.com']# redis_key = 'dangdang'start_urls = ['http://book.dangdang.com/']rules = (# 直接提取小分類(lèi)的頁(yè)面的鏈接并請(qǐng)求頁(yè)面Rule(LinkExtractor(restrict_xpaths='//dl[@class="inner_dl"]/dd/a'), callback='parse_data',follow=True),# 提取下一頁(yè)的鏈接并請(qǐng)求 因?yàn)閟crapy的請(qǐng)求是放在調(diào)度器中Rule(LinkExtractor(restrict_xpaths='//ul[@name="Fy"]/li/a'), callback='parse_data'))def parse_data(self, response):print(response)

以下為打印的response結(jié)果:

同時(shí)記住不要忘記提取他的分類(lèi)噢

可以看到已經(jīng)請(qǐng)求到這些圖書(shū)的鏈接。然后再開(kāi)始獲取這些頁(yè)面的圖書(shū)信息,可以看到這些圖書(shū)都在class="bigimg"的ul標(biāo)簽下的li標(biāo)簽里,只需要提取到ul標(biāo)簽下的所有的li標(biāo)簽,遍歷之后再提取就好了


提取圖書(shū)信息的代碼如下:

def parse_data(self, response):item = {}# 獲取分類(lèi)信息item['big_sort'] = response.xpath('//div[@class="crumbs_fb_left"]/div[1]/a/text()').extract_first()item['small_sort'] = response.xpath('//div[@class="crumbs_fb_left"]/div[2]/a/text()').extract_first()# 因?yàn)楫?dāng)當(dāng)有些圖書(shū)頁(yè)面結(jié)構(gòu)不一樣,所以的話會(huì)查詢不到,需要加一個(gè)判斷if item['big_sort']:# 獲取該頁(yè)面下所有的包含圖書(shū)信息的li標(biāo)簽lis = response.xpath('//ul[@class="bigimg"]/li')# 遍歷提取需要的信息for li in lis:item['book_name'] = li.xpath('./a/@title').extract_first()item['price_now'] = li.xpath('./p[@class="price"]/span[@class="search_now_price"]/text()').extract_first()item['price_pre'] = li.xpath('./p[@class="price"]/span[@class="search_pre_price"]/text()').extract_first()item['book_shop'] = li.xpath('./p[@class="search_shangjia"]/a/text()').extract_first()# print(item)yield item

運(yùn)行結(jié)果如下,可以看到所有需要的信息都被提取到了,他的價(jià)格竟然可以直接獲取,哈哈,也是很容易就獲取到了呢,就是他有的圖書(shū)頁(yè)面的結(jié)構(gòu)是不一樣的,所以需要加一個(gè)判斷,不一樣的結(jié)構(gòu)頁(yè)面我就不爬咯
然后再settings文件中添加以下配置

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True # 為false Redis關(guān)閉了 Redis數(shù)據(jù)也會(huì)被清空 REDIS_URL = "redis://127.0.0.1:6379"

修改spider文件,讓他繼承RedisCrawlSpider,然后不需要start_urls,這個(gè)需要我們使用redis客戶端手動(dòng)壓入,對(duì)了別忘記開(kāi)啟redis服務(wù)端噢,現(xiàn)在就實(shí)現(xiàn)了分布式爬蟲(chóng),關(guān)閉爬蟲(chóng)之后,下次再開(kāi)始就不會(huì)繼續(xù)爬取上次已經(jīng)爬過(guò)的內(nèi)容

from scrapy_redis.spiders import RedisCrawlSpider from copy import deepcopyclass SpiderSpider(RedisCrawlSpider):name = 'dd_book'allowed_domains = ['dangdang.com']redis_key = 'dangdang'# start_urls = ['http://book.dangdang.com/']

到現(xiàn)在就可以使用pipeline直接保存爬取到的信息咯,再配置項(xiàng)中開(kāi)啟pipeline,我選擇保存在MongoDB,因?yàn)镸ongoDB比較適合保存字典類(lèi)型的文件,pipeline文件如下,MongoDB使用的時(shí)候也不能忘記開(kāi)啟服務(wù)端喲

from pymongo import MongoClientclass DangdangPipeline(object):def __init__(self):self.mongo_cli = MongoClient(host='localhost', port=27017)self.db = self.mongo_cli['dang_dang_book']def process_item(self, item, spider):self.db.dang_dang_book.insert_one(item)print(item, '已保存')return item

最終保存結(jié)果如下,大概不到3分鐘獲取了1萬(wàn)多條數(shù)據(jù),settings中還設(shè)置了delay為3秒,速度還是挺快的:

總結(jié)

以上是生活随笔為你收集整理的RedisCrawlSpider爬取当当图书信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。