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標簽,遍歷之后再提取就好了
提取圖書信息的代碼如下:
運行結果如下,可以看到所有需要的信息都被提取到了,他的價格竟然可以直接獲取,哈哈,也是很容易就獲取到了呢,就是他有的圖書頁面的結構是不一樣的,所以需要加一個判斷,不一樣的結構頁面我就不爬咯
然后再settings文件中添加以下配置
修改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爬取当当图书信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php工商亮照添加代码,市场监管总局电子
- 下一篇: 数据库知识个人总结