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