1. 程式人生 > >一個站點的誕生02--用Scrapy抓取數據

一個站點的誕生02--用Scrapy抓取數據

項目 selector 默認安裝 找不到 shang foo 術語 替換 產生

假設想抓數據,就須要有爬蟲程序,業內叫crawler或者spider。




有各種語言版本號的開源爬蟲。c++, Java, php,在github上搜一下,以"spider c++"為keyword,有245個開源爬蟲,以"spider java"為keyword。有48個。

那python呢?156個。


爬蟲技術在業界已經非常成熟了。有非常多開源框架,在它們的幫助下寫爬蟲能夠非常快,幾個小時就能寫一個不錯的東東用。

爬蟲技術也會非常復雜。假設要做分布式抓取和全文檢索,一般使用Nutch。


最有名的Python爬蟲框架是Scrapy,這個名字也蠻有意思的,預計是Spider。Crawler,python各取部分字符組合起來的。它的官方主頁在http://scrapy.org/。




1. 安裝Scrapy
安裝Scrapy非常easy,linux系統的話,一條語句就能夠了。"sudo pip install Scrapy"。

通常python在Linux各發行版上都是默認安裝的。pip是python的包管理工具,運行install命令後。它會從網上下載最新版本號的Scrapy安裝。安裝完成。在命令行輸入命令"scrapy version"。會打印scrapy的版本號。表明成功安裝。




2. 生成項目文件夾
假設要抓取大眾點評網,須要先創建項目。選擇一個空文件夾,比方在我的電腦上是/tmp/scrapy-test。在命令行輸入"scrapy startproject crawdp",startproject是scrapy的一個命令。執行後,在/tmp/scrapy-test文件夾會出現一個新文件夾crawdp。它包括scrawdp項目所須要的一切東東,如源碼和配置文件。

執行"tree crawdp",能夠看到整個文件夾結構。




那麽,"startproject""創建項目"這個高大上字眼背後的真相是什麽呢?事實上不復雜,就是創建一個項目名的文件夾和它的幾個子文件夾,然後復制幾個指定的文件到這些文件夾,再把這些文件中的幾個特定字符串替換成項目名。這塊的代碼在scrapy源碼的scrapy/command/commands文件夾下的startproject.py文件中。而在"tree crawdp"看到的文件。它們的原型在scrapy/templates/project/module文件夾下,如settings.py.tmpl文件,把它裏面的字符串"$project_name"用"crawdp"替換,再把文件名稱改成settings.py,就是crawdp的settings.py文件。


像settings.py.tmpl這種文件。又稱為模板文件。把模板裏的變量用字符串替換掉。叫渲染(render)。在web server的開發中也相同使用這種技術,前端工程師設計html文件,裏面包括形如"$project_name"之類的變量,保存成模板文件,而服務器在執行的時候,用執行時產生的字符串替換掉模板裏的變量,再把替換後的內容發給瀏覽器,就是我們看到的網頁,所以叫動態頁面。


3. 第一個spider
開始寫第一個spider,這是一個很easy的spider,僅僅有13行代碼。


在/tmp/scrapy-test/crawdp/crawdp/spiders文件夾下,創建文件cityid_spider.py。內容例如以下:
-----------------------------------------
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector


class CityidSpider(BaseSpider):
name = "cityid_spider"
start_urls = ["http://www.dianping.com/shanghai/food"]


def parse(self, response):
hxs = HtmlXPathSelector(response)
xs = hxs.select(‘//ul[@class=\"nc_list\"][email protected])
x = xs[0]
cityid = x.extract().split(‘/‘)[3]
print "\n\n\ncityid = %s\n\n\n" % cityid
-----------------------------------------
返回到/tmp/scrapy-test/crawdp/文件夾,在這個文件夾下運行"scrapy crawl cityid_spider",能夠看到打印出來的結果是"cityid = 1",在默認配置下,順帶會打印非常多log信息,所以我在這句加了幾個換行符。讓它顯示得清楚一點。


註意,這裏有幾個關鍵點:
a. cityid_spider.py這個文件,必須放在/tmp/scrapy-test/crawdp/crawdp/spiders文件夾下,放在別的地方,scrapy找不到。


b. 源碼裏。name = "cityid_spider"這句必須有。這裏指定了spider的名字,scrapy靠名字識別不同的spider。
c. 必須在/tmp/scrapy-test/crawdp/下運行"scrapy crawl cityid_spider",在別的文件夾下不行。
其它的,能夠把class CityidSpider類名換成別的,沒關系,也能夠cityid_spider.py文件名稱換成別的名字,也沒關系。不影響效果。




這個spider是一切spider的基本型,更復雜的spider都是在它的基礎上逐漸加入很多其它功能做出來的。


4. 這個spider是幹什麽的
在大眾點評網,每一個城市都有一個數字代號,比方上海是1,北京是2。深圳是7。它家的總部在上海。所以上海是1號。假設想抓很多其它城市的餐廳,就須要知道城市代號。

上海的城市代號,能夠從http://www.dianping.com/shanghai/food抓取。在瀏覽器打開http://www.dianping.com/shanghai/food,在左側的“商區”以下,有“陸家嘴”,在它上面點擊右鍵。選擇“審查元素”,假設你用的是chrome,瀏覽器會開一個窗體,用高亮色定位到陸家嘴相應的html元素。這個元素包括一個超級鏈接。叫"/search/category/1/10/r801" 。那麽上海的cityid就是超級鏈接裏的category後面"1",而這個鏈接。是嵌套在一個固定的層次式的html元素裏。也就是形如代碼裏形如"//ul[@class=\"nc_list\"][email protected]"的結構。這樣的寫法叫xpath。




執行"scrapy crawl cityid_spider"的時候,spider開始執行,它先檢查spider源碼裏的“start_urls = ["http://www.dianping.com/shanghai/food"]”,依據這個url,從大眾點評網上抓取html文件內容。存在response裏,然後調用parse函數,從response裏用xpath解析出全部符合"//ul[@class=\"nc_list\"][email protected]"的html元素,取第一個。得到一個類似“/search/category/1/10/r801”的字符串,然後將它以‘/‘為間隔做切割,取第3個。就是"1",就是cityid,這就是parse函數的前四條語句做的事情。


這塊寫的略有一點不人性化。術語比較多。那麽,想做抓取的話,至少要懂一點html,css,web server,xpath。稍微有點基礎即可。這些東西在這裏就不展開了,找本入門書看看就能夠了。

一個站點的誕生02--用Scrapy抓取數據