Spider爬取過程
以初始的URL初始化Request,並設定回呼函數。當該request下載完畢並返回時,將產生response,並作為參數傳遞給該回呼函數。
spider中初始的request是通過調用start_requests()來擷取的。start_request()讀取start_urls中的URL,並以parse為回呼函數產生Request。
在回呼函數內分析返回的(網頁)內容,返回 Item 對象或者 Request 或者一個包括二者的可迭代容器。返回的Request對象之後會經過Scrapy處理,下載相應的內容並調用設定的callback函數(函數可相同)。
在回呼函數內,您可以使用選取器(Selector、BeautifulSoup、lxml等)來分析網頁內容,並根據分析的資料產生item。
最後,由spider返回的item將被存到資料庫(由某些Item Pipeline處理)或使用 Feed exports存入到檔案中。
Spider範例
| 代碼如下 |
複製代碼 |
import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): ''' 一個回呼函數中返回多個Request對象和Item ''' name = 'example.com' allowed_domains = ['example.com'] start_urls = [ 'http://www.example.com/1.html', 'http://www.example.com/2.html', 'http://www.example.com/3.html', ] def parse(self, response): sel = scrapy.Selector(response) for h3 in response.xpath('//h3').extract(): yield MyItem(title=h3) for url in response.xpath('//a/@href').extract(): yield scrapy.Request(url, callback=self.parse) |
CrawlSpider範例
| 代碼如下 |
複製代碼 |
import scrapy from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractor class MySpider(CrawlSpider): name = 'example.com' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] # 在如下的規則中,第一條表示匹配category.php但是不匹配subsection.php(沒有callback意味著follow為True表示跟進連結) # 在如下的規則中,第二條表示表示匹配item.php,並使用spider的parse_item方法進行分析。 rules = ( Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))), Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'), ) def parse_item(self, response): self.log('Hi, this is an item page! %s' % response.url) item = scrapy.Item() item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)') item['name'] = response.xpath('//td[@id="item_name"]/text()').extract() item['description'] = response.xpath('//td[@id="item_description"]/text()').extract() return item |