Python爬虫——Scrapy Spiders
Scrapy Spiders
spider是定義一個特定站點(或一組站點)如何被抓取的類,包括如何執行抓取(即跟蹤鏈接)以及如何從頁面中提取結構化數據(即抓取項)。換言之,spider是為特定站點(或者在某些情況下,一組站點)定義爬行和解析頁面的自定義行為的地方。
抓取周期:
要執行的第一個請求是通過調用?start_requests()?(默認)生成的方法?Request?對于中指定的URL?start_urls?以及?parse?方法作為請求的回調函數
Spider
class?scrapy.spiders.Spider
Spider是最簡單的spider。每個其他的spider必須繼承自該類(spiders.Spider)(包括Scrapy自帶的其它spider,還有你自己寫的蜘蛛)。它不提供任何特殊功能。它只是提供了一個默認值?start_requests()?從發送請求的實現?start_urls?spider屬性并調用spider的方法?parse?對于每個結果響應。
name:定義spider名字的字符串(string)。spider的名字定義了Scrapy如何定位(并初始化)spider,所以其必須是唯一的。 不過您可以生成多個相同的spider實例(instance),這沒有任何限制
allowed_domains:可選。包含了spider允許爬取的域名(domain)列表(list)。 當?OffsiteMiddleware?啟用時, 域名不在列表中的URL不會被跟進
start_urls:URL列表。當沒有制定特定的URL時,spider將從該列表中開始進行爬取。 因此,第一個被獲取到的頁面的URL將是該列表之一。 后續的URL將會從獲取到的數據中提取
custom_settings:該設置是一個dict,當啟動spider時,該設置可以覆蓋整個settings文件,將會覆蓋整個項目的設置。由于設置必須在初始化(instantiation)前被更新,所以該屬性必須定義為class屬性。
crawler:該屬性在初始化class后,由類方法?from_crawler()?設置, 并且鏈接了本spider實例對應的?Crawler?對象.
Crawler包含了很多項目中的組件,作為單一的入口點 (例如插件,中間件,信號管理器等)是擴展scrapy核心組件和掛載scrapy的唯一途徑
Settings:控制包括核心插件和其它一些spider組件的配置
start_requests():該方法必須返回一個可迭代對象(iterable)。該對象包含了spider用于爬取的第一個Request
當spider啟動爬取并且未制定URL時,該方法被調用。 當指定了URL時,make_requests_from_url()?將被調用來創建Request對象。 該方法僅僅會被Scrapy調用一次,因此您可以將其實現為生成器
該方法的默認實現是使用?start_urls?的url生成Request
eg:爬取httpbin的post頁面
class HttpbinSpider(scrapy.Spider):name = 'httpbin'allowed_domains = ['httpbin.org']start_urls = ['http://httpbin.org/post']def start_requests(self):yield scrapy.Request(url='http://httpbin.org/post',method='POST',callback=self.parse_post)def parse(self, response):passdef parse_post(self, response):print('Hello',response.text)?輸出:
Hello {
? "args": {},
? "data": "",
? "files": {},
? "form": {},
? "headers": {
? ? "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
? ? "Accept-Encoding": "gzip,deflate",
? ? "Accept-Language": "en",
? ? "Content-Length": "0",
? ? "Host": "httpbin.org",
? ? "User-Agent": "Scrapy/1.0.1 (+https://scrapy.org)",
? ? "X-Amzn-Trace-Id": "Root=1-5f5054fa-95788485e064feec9d51f126"
? },
? "json": null,
? "origin": "117.136.4.15",
? "url": "http://httpbin.org/post"
}
?make_requests_from_url(url):接受一個URL并返回用于爬取的?Request?對象。 該方法在初始化request時被?start_requests()?調用,也被用于轉化url為request
默認未被復寫(overridden)的情況下,該方法返回的Request對象中,?parse()?作為回調函數,dont_filter參數也被設置為開啟
eg:爬取百度
class BaiduSpider(scrapy.Spider):name = 'baidu'allowed_domains = ['www.baidu.com']start_urls = ['http://www.baidu.com/']def make_requests_from_url(self, url):return scrapy.Request(url=url, callback=self.parse_index)def parse(self, response):passdef parse_index(self, response):print('Baidu',response.status)輸出:
Baidu 200
parse():當response沒有指定回調函數時,該方法是Scrapy處理下載的response的默認方法。
parse?負責處理response并返回處理的數據以及(/或)跟進的URL。?Spider?對其他的Request的回調函數也有相同的要求。
該方法及其他的Request回調函數必須返回一個包含?Request、dict 或?Item?的可迭代的對象。
?
總結
以上是生活随笔為你收集整理的Python爬虫——Scrapy Spiders的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tablepc是什么平板电脑_Table
- 下一篇: python --通过urlretrie