scrapy-redis mysql_scrapy-redis 构建分布式爬虫,此片文章有问题。不要用
此篇文章為轉載,只供學習,有很多問題,如沒有解決分布式去重問題。最好還是用scrapy-redis給出的例子代碼
前言
scrapy是Python界出名的一個爬蟲框架。Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
雖然scrapy能做的事情很多,但是要做到大規模的分布式應用則捉襟見肘。有能人改變了scrapy的隊列調度,將起始的網址從start_urls里分離出來,改為從Redis讀取,多個客戶端可以同時讀取同一個redis,從而實現了分布式的爬蟲。就算在同一臺電腦上,也可以多進程的運行爬蟲,在大規模抓取的過程中非常有效。
準備
既然這么好能實現分布式爬取,那都需要準備什么呢?
需要準備的東西比較多,都有:
- scrapy
- scrapy-redis
- redis
- python的mysqldb模塊
- python的redis模塊
為什么要有mysql呢?是因為我們打算把收集來的數據存放到mysql中
1. scrapy安裝
pip install scrapy
2. scrapy-redis安裝
pip install scrapy-redis
3.redis
4.mysql
因為我們打算用mysql來存儲數據,所以mysql的配置是不可或缺的。下載地址http://dev.mysql.com/downloads/
5.mysqldb模塊和redis模塊
為什么需要這2個呢,是因為python不能直接操作數據庫,需要通過庫來支持。而這2個就是相應數據庫的支持庫。
mysqldb:https://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/,windows環境下可以直接下.exe來快速安裝
redis:
pip install redis
這樣就是最簡單的了。
動工
先來看下scrapy-redis的一些不同的地方。
首先就是class的父對象變了,變成了特有的RedisSpider,這是scrapy-redis里面自己定義的新的爬蟲類型。其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis將key從list中pop出來成為請求的url地址。
我們這次選取的對象是58同城的平板電腦信息。
首先來看一下架構信息。
scrapy.cfg文件我們可以不管,readme.rst文件也不管(這個是github上有用的,scrapy創建項目的時候并沒有)
pbdnof58文件夾內的結構:
items定義文件,settings設置文件,pipelines處理文件以及spiders文件夾。
spiders文件夾盛放著我們編寫的具體爬蟲:
可以看到里面有2個爬蟲,一個是用來爬所有的url地址,并將其傳遞給redis。而另外一個則是根據爬取出來的地址處理具體的商品信息。
具體來看。首先是settings.py文件。
跟scrapy一樣,寫明spider的位置。
2個處理數據的pipeline中的類,數字越小優先執行。
因為數據要存放在mysql中,所以需要配置下mysql的信息。而redis是默認采用本地的,所以并沒有配置信息,如果是連接別的主機的話,需要配置下redis的連接地址。
item.py文件
與scrapy相比多了個調度文件,多了個ItemLoader類,照著做就好了,ItemLoader類后面會用到的。
pipeline.py文件
最重要的是這個將結果存儲到mysql中。
要在一個名為qcl的數據庫之中建一個名叫58pbdndb的表。qcl對應settings的配置。
create table 58pbdndb(
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
price VARCHAR(40) NOT NULL,
quality VARCHAR(40),
area VARCHAR(40),
time VARCHAR(40) NOT NULL,
PRIMARY KEY ( id )
)DEFAULT CHARSET=utf8;
注意:我并沒有在表的一開始檢查字段是否存在,如果你在調試過程中不止一次的話,你可能需要多次刪除表中數據。
58Urlspider.py文件
這個爬蟲實現了2個功能。1是如果next(也就是下一頁)存在,則把下一頁的地址壓進redis的myspider:58_urls的這個list中,供自己繼續爬取。2是提取出想要爬取的商品具體網址,壓進redis的myspider:start_urls的list中,供另一個爬蟲爬取。
58spider-redis.py文件
這個爬蟲是用來抓取具體的商品信息。可以看到ItemLoader類的add_path和add_value方法的使用。
最后
運行方法跟scrapy相同,就是進入pbdnof58文件夾下(注意下面是只有spiders文件夾的那個).輸入
scrapy crawl myspider_58page和scrapy crawl myspider_58
可以輸入多個來觀察多進程的效果。。打開了爬蟲之后你會發現爬蟲處于等待爬取的狀態,是因為2個list此時都為空。所以需要
lpush myspider:58_urls http://hz.58.com/pbdn/0/
來設置一個初始地址,好啦,這樣就可以愉快的看到所有的爬蟲都動起來啦。
最后來張數據庫的圖
本文相對比較簡單,只是scrapy-redis的基本應用。本人也比較小白,剛剛開始學習,如有什么問題,歡迎提出來共同進步。
總結
以上是生活随笔為你收集整理的scrapy-redis mysql_scrapy-redis 构建分布式爬虫,此片文章有问题。不要用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node.js mysql 不退出_no
- 下一篇: java 接口 返回值_java api