一個站點的誕生02--用Scrapy抓取數據
有各種語言版本號的開源爬蟲。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抓取數據