產生項目
scrapy提供一個工具來產生項目,產生的項目中預設了一些文件,使用者需要在這些文件中加入自己的程式碼。
開啟指令列,執行:scrapy startproject tutorial,產生的項目類似下面的結構
tutorial/
scrapy.cfg
__ items.py pipelines.py settings .py spiders/ __init__.py cf. ,一個spider類似from scrapy.spider import BaseSpider class DmozSpider(BaseSpider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): filename = response.url.split("/")[-2] open(filename, 'wb').write(response.body)name屬性很重要,不同spider不能使用相同的namestart_urls是spider抓取網頁的起始點,可以包括多個urlparse方法是spider抓到一個網頁以後默認調用的callback,避免使用這個名字來定義自己的方法。 當spider拿到url的內容以後,會呼叫parse方法,並且傳遞一個response參數給它,response包含了抓到的網頁的內容,在parse方法裡,你可以從抓到的網頁裡面解析數據。上面的程式碼只是簡單地把網頁內容儲存到檔案。
開始抓取
你可以打開命令行,進入生成的項目根目錄tutorial/,執行 scrapy crawl dmoz, dmoz是spider的name。
解析網頁內容
scrapy提供了方便的辦法從網頁中解析數據,這需要使用到HtmlXPathSelector
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector class DmozSpider(BaseSpider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): hxs = HtmlXPathSelector(response) sites = hxs.select('//ul/li') for site in sites: title = site.select('a/text()').extract() link = site.select('a/@href').extract() desc = site.select('text()').extract() print title, link, desc
HtmlXPathSelector使用了Xpath來解析數據
下的li標籤
a/@href表示選擇所有a標籤的href屬性
a/text()表示選擇a標籤文字
a[@href="abc"]表示選取所有href屬性是abc的a標籤
我們可以把解析出來的資料保存在一個scrapy可以使用的物件中,然後scrapy可以幫助我們把這些物件保存起來,而不用我們自己把這些資料存到檔案中。我們需要在items.py中加入一些類,這些類別用來描述我們要保存的資料
from scrapy.item import Item, Field class DmozItem(Item): title = Field() link = Field() desc = Field() 然后在spider的parse方法中,我们把解析出来的数据保存在DomzItem对象中。 from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from tutorial.items import DmozItem class DmozSpider(BaseSpider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): hxs = HtmlXPathSelector(response) sites = hxs.select('//ul/li') items = [] for site in sites: item = DmozItem() item['title'] = site.select('a/text()').extract() item['link'] = site.select('a/@href').extract() item['desc'] = site.select('text()').extract() items.append(item) return items
在命令列執行scrapy的時候,我們可以加兩個參數,讓scrapy把parse方法返回的items輸出到json檔案中
scrapy crawl dmoz -o items.json -t json
items.json會被放在專案的根目錄
讓scrapyscrapyscrap只抓取了start_urls裡面的兩個url的內容,但是通常我們想實現的是scrapy自動發現一個網頁上的所有鏈接,然後再去抓取這些鏈接的內容。為了實現這一點我們可以在parse方法裡面提取我們需要的鏈接,然後構造一些Request對象,並且把他們返回,scrapy會自動的去抓取這些鏈接。程式碼類似:class MySpider(BaseSpider): name = 'myspider' start_urls = ( 'http://example.com/page1', 'http://example.com/page2', ) def parse(self, response): # collect `item_urls` for item_url in item_urls: yield Request(url=item_url, callback=self.parse_item) def parse_item(self, response): item = MyItem() # populate `item` fields yield Request(url=item_details_url, meta={'item': item}, callback=self.parse_details) def parse_details(self, response): item = response.meta['item'] # populate more `item` fields return itemparse是預設的callback, 它返回了一個Request列表,scrapy自動的根據這個列表抓取網頁,每當抓到一個網頁,就會調用parse_item,parse_item也會返回一個列表,scrapy又會根據這個列表去抓網頁,並且抓到後調用parse_details為了讓這樣的工作更容易,scrapy提供了另一個spider基類,利用它我們可以方便的實現自動抓取鏈接. 我們要用到CrawlSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor class MininovaSpider(CrawlSpider): name = 'mininova.org' allowed_domains = ['mininova.org'] start_urls = ['http://www.mininova.org/today'] rules = [Rule(SgmlLinkExtractor(allow=['/tor/\d+'])), Rule(SgmlLinkExtractor(allow=['/abc/\d+']), 'parse_torrent')] def parse_torrent(self, response): x = HtmlXPathSelector(response) torrent = TorrentItem() torrent['url'] = response.url torrent['name'] = x.select("//h1/text()").extract() torrent['description'] = x.select("//div[@id='description']").extract() torrent['size'] = x.select("//div[@id='info-left']/p[2]/text()[2]").extract() return torrent相比BaseSpider,新的類別多了一個rules屬性,這個屬性是一個列表,它可以包含多個Rule,每個Rule描述了哪些連結需要抓取,哪些不需要。這是Rule類別的文檔http://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.contrib.spiders.Rule
這些rule可以有callback,也可以沒有,當沒有callback的時候,scrapy簡單的follow所有這些連結.
pipelines.py的使用
在pipelines.py中我們可以添加一些類別來過濾掉我們不想要的item,把item保存到資料庫。
from scrapy.exceptions import DropItem class FilterWordsPipeline(object): """A pipeline for filtering out items which contain certain words in their description""" # put all words in lowercase words_to_filter = ['politics', 'religion'] def process_item(self, item, spider): for word in self.words_to_filter: if word in unicode(item['description']).lower(): raise DropItem("Contains forbidden word: %s" % word) else: return item
如果item不符合要求,那麼就拋一個異常,這個item不會被輸出到json檔案中。
要使用pipelines,我們還需要修改settings.py
添加一行
ITEM_PIPELINES = ['dirbot.pipelines.FilterWordsPipeline']
現在執行scrapy crawlvsrapy cralson - 符合的要求。 item就被過濾掉了

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),