RedisCrawlSpider爬取当当图书信息
首先查看以下當(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ū)信息的代碼如下:
運(yùn)行結(jié)果如下,可以看到所有需要的信息都被提取到了,他的價(jià)格竟然可以直接獲取,哈哈,也是很容易就獲取到了呢,就是他有的圖書(shū)頁(yè)面的結(jié)構(gòu)是不一樣的,所以需要加一個(gè)判斷,不一樣的結(jié)構(gòu)頁(yè)面我就不爬咯
然后再settings文件中添加以下配置
修改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)題。
- 上一篇: php工商亮照添加代码,市场监管总局电子
- 下一篇: 数据库知识个人总结