小甲魚第63課scrapy程序代碼
使用scrapy抓取一個網站一個需要四個步驟:
- 創建一個scrapy項目:scrapy startproject tutorial
- 定義Item容器
- 編寫爬蟲
- 存儲內容
這裡程序開發的步驟:
1.創建scrapy項目:
scrapy startproject tutorialn
該命令將會創建包含下列內容的 tutorial
目錄:
tutorial/n scrapy.cfgn tutorial/n __init__.pyn items.pyn pipelines.pyn settings.pyn spiders/n __init__.pyn ...n
這些文件分別是:
scrapy.cfg
: 項目的配置文件tutorial/
: 該項目的python模塊。之後您將在此加入代碼。tutorial/items.py
: 項目中的item文件.tutorial/pipelines.py
: 項目中的pipelines文件.tutorial/settings.py
: 項目的設置文件.tutorial/spiders/
: 放置spider代碼的目錄.
2.定義Item容器:
items.py
# -*- coding: utf-8 -*-nn# Define here the models for your scraped itemsn#n# See documentation in:n# http://doc.scrapy.org/en/latest/topics/items.htmlnnimport scrapynnnclass DmozItem(scrapy.Item):n # define the fields for your item here like:n # name = scrapy.Field()n title = scrapy.Field()n link = scrapy.Field()n desc = scrapy.Field()n
3.編寫爬蟲:
tutorialspidersdmoz_spider.py
import scrapynnfrom tutorial.items import DmozItemnnclass DmozSpider(scrapy.Spider):n name = "dmoz"n allowed_domains = [dmoztools.net]n start_urls = [n "http://dmoztools.net/Computers/Programming/Languages/Python/Books/",n "http://dmoztools.net/Computers/Programming/Languages/Python/Resources/"n ]nn def parse(self,response):n # filename = response.url.split("/")[-2]n # with open(filename,wb) as f:n # f.write(response.body)n items = []n sel = scrapy.selector.Selector(response)n sites = sel.xpath(//div[@class="title-and-desc"])n for site in sites:n item = DmozItem()n item[title] = site.xpath(a/div/text()).extract()n item[link] = site.xpath(a/@href).extract()n item[desc] = site.xpath(div/text()).extract()n items.append(item)nn return itemsn
4.存儲內容
scrapy crawl dmoz -o items.json -t jsonn
5.用到的XPath一些知識
XPath表達式的例子和含義:
- /html/head/title: 選擇HTML文檔中 <head> 標籤內的 <title> 元素
- /html/head/title/text(): 選擇上面提到的 <title> 元素的文字
- //td: 選擇所有的 <td> 元素
- //div[@class="mine"]: 選擇所有具有 class="mine" 屬性的 div 元素
6.執行結果:
推薦閱讀:
※Scrapy爬蟲框架教程(三)-- 調試(Debugging)Spiders
※第十一章 Scrapy入門程序點評
※scrapy做爬蟲時,導入Module的時候總顯示no module named ×××.items?
※如何高效學習python的某一個包?