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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

RedisCrawlSpider爬取当当图书信息

發布時間:2023/12/31 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RedisCrawlSpider爬取当当图书信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先查看以下當當網的頁面結構,可以看到的是圖書的大小分類都在class="con flq_body"的div中。記得要看看頁面源代碼中是否有這些數據噢

然后可以看到所有小分類的鏈接都在class="inner dl"的dl標簽中,所以使用link_extractor可以直接提取,再到詳情頁面獲取大小分類。
然后將下一頁的鏈接也提取出來,這樣就可以獲取到所有的數據咯

具體分析已經做完就可以開始敲代碼,首先開始寫一個crawlspider文件。可以自己寫import,如果嫌麻煩可以直接使用cmd創建

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 = (# 直接提取小分類的頁面的鏈接并請求頁面Rule(LinkExtractor(restrict_xpaths='//dl[@class="inner_dl"]/dd/a'), callback='parse_data',follow=True),# 提取下一頁的鏈接并請求 因為scrapy的請求是放在調度器中Rule(LinkExtractor(restrict_xpaths='//ul[@name="Fy"]/li/a'), callback='parse_data'))def parse_data(self, response):print(response)

以下為打印的response結果:

同時記住不要忘記提取他的分類噢

可以看到已經請求到這些圖書的鏈接。然后再開始獲取這些頁面的圖書信息,可以看到這些圖書都在class="bigimg"的ul標簽下的li標簽里,只需要提取到ul標簽下的所有的li標簽,遍歷之后再提取就好了


提取圖書信息的代碼如下:

def parse_data(self, response):item = {}# 獲取分類信息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()# 因為當當有些圖書頁面結構不一樣,所以的話會查詢不到,需要加一個判斷if item['big_sort']:# 獲取該頁面下所有的包含圖書信息的li標簽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

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

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True # 為false Redis關閉了 Redis數據也會被清空 REDIS_URL = "redis://127.0.0.1:6379"

修改spider文件,讓他繼承RedisCrawlSpider,然后不需要start_urls,這個需要我們使用redis客戶端手動壓入,對了別忘記開啟redis服務端噢,現在就實現了分布式爬蟲,關閉爬蟲之后,下次再開始就不會繼續爬取上次已經爬過的內容

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/']

到現在就可以使用pipeline直接保存爬取到的信息咯,再配置項中開啟pipeline,我選擇保存在MongoDB,因為MongoDB比較適合保存字典類型的文件,pipeline文件如下,MongoDB使用的時候也不能忘記開啟服務端喲

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

最終保存結果如下,大概不到3分鐘獲取了1萬多條數據,settings中還設置了delay為3秒,速度還是挺快的:

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。