日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 爬虫框架Scrapy Spiders学习

發布時間:2023/12/16 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 爬虫框架Scrapy Spiders学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spider類定義了如何爬取某個(或某些)網站。包括了爬取的動作(例如:是否跟進鏈接)以及如何從網頁的內容中提取結構化數據(爬取item)。 換句話說,Spider就是您定義爬取的動作及分析某個網頁(或者是有些網頁)的地方。

對spider來說,爬取的循環類似下文:

  • 以初始的URL初始化Request,并設置回調函數。 當該request下載完畢并返回時,將生成response,并作為參數傳給該回調函數。spider中初始的request是通過調用 start_requests() 來獲取的。 start_requests() 讀取 start_urls 中的URL, 并以 parse 為回調函數生成 Request 。
  • 在回調函數內分析返回的(網頁)內容,返回 Item 對象或者 Request 或者一個包括二者的可迭代容器。 返回的Request對象之后會經過Scrapy處理,下載相應的內容,并調用設置的callback函數(函數可相同)。
  • 在回調函數內,您可以使用 選擇器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 來分析網頁內容,并根據分析的數據生成item。
  • 最后,由spider返回的item將被存到數據庫(由某些 Item Pipeline 處理)或使用 Feed exports 存入到文件中。
  • Spider參數

    Spider可以通過接受參數來修改其功能。 spider參數一般用來定義初始URL或者指定限制爬取網站的部分。 您也可以使用其來配置spider的任何功能。
    在運行 crawl 時添加 -a 可以傳遞Spider參數。
    舉個例子:

    # file SpiderDemo.py import scrapyclass SpiderDemo(scrapy.spiders.Spider):name = "SpiderDemo"allowed_domains = ["acm.hnucm.edu.cn"]start_urls = ["http://acm.hnucm.edu.cn/JudgeOnline/problemset.php"]def parse(self, response):filename = self.filenamewith open(filename, 'wb') as f:f.write(response.body)def __init__(self, filename = None):super(SpiderDemo, self).__init__()self.filename = filename

    運行 crawl 時傳遞Spider參數

    :ls __init__.py __pycache__ spider_demo.py :scrapy crawl SpiderDemo -a filename=problem.txt --nolog :ls __init__.py __pycache__ problem.txt spider_demo.py

    Spider參數也可以通過Scrapyd的 schedule.json API來傳遞。

    Spider

    Spider是最簡單的spider。每個其他的spider必須繼承自該類(包括Scrapy自帶的其他spider以及您自己編寫的spider)。 Spider并沒有提供什么特殊的功能。 其僅僅請求給定的 start_urls/start_requests ,并根據返回的結果(resulting responses)調用spider的 parse 方法。

    • name
      定義spider名字的字符串(string)。spider的名字定義了Scrapy如何定位(并初始化)spider,所以其必須是唯一的。 不過您可以生成多個相同的spider實例(instance),這沒有任何限制。 name是spider最重要的屬性,而且是必須的。
      如果該spider爬取單個網站(single domain),一個常見的做法是以該網站(domain)(加或不加 后綴 )來命名spider。 例如,如果spider爬取 mywebsite.com ,該spider通常會被命名為 mywebsite 。
    • allowed_domains
      可選。包含了spider允許爬取的域名(domain)列表(list)。 當 OffsiteMiddleware 啟用時, 域名不在列表中的URL不會被跟進。
    • start_urls
      URL列表。當沒有制定特定的URL時,spider將從該列表中開始進行爬取。 因此,第一個被獲取到的頁面的URL將是該列表之一。 后續的URL將會從獲取到的數據中提取。
    • start_requests()
      該方法必須返回一個可迭代對象(iterable)。該對象包含了spider用于爬取的第一個Request。
      當spider啟動爬取并且未制定URL時,該方法被調用。 當指定了URL時,make_requests_from_url() 將被調用來創建Request對象。 該方法僅僅會被Scrapy調用一次,因此您可以將其實現為生成器。
      該方法的默認實現是使用 start_urls 的url生成Request。
      如果您想要修改最初爬取某個網站的Request對象,您可以重寫(override)該方法。 例如,如果您需要在啟動時以POST登錄某個網站,你可以這么寫:def start_requests(self):return [scrapy.FormRequest("http://www.example.com/login",formdata={'user': 'john', 'pass': 'secret'},callback=self.logged_in)]def logged_in(self, response):# here you would extract links to follow and return Requests for# each of them, with another callbackpass
    • make_requests_from_url(url)
      該方法接受一個URL并返回用于爬取的 Request 對象。 該方法在初始化request時被 start_requests() 調用,也被用于轉化url為request。
      默認未被復寫(overridden)的情況下,該方法返回的Request對象中, parse() 作為回調函數,dont_filter參數也被設置為開啟。 (詳情參見 Request).
    • parse(response)
      當response沒有指定回調函數時,該方法是Scrapy處理下載的response的默認方法。
      parse 負責處理response并返回處理的數據以及(/或)跟進的URL。 Spider 對其他的Request的回調函數也有相同的要求。
      該方法及其他的Request回調函數必須返回一個包含 Request 及(或) Item 的可迭代的對象。
      參數: response (Response) – 用于分析的response
    • log(message[, level, component])
      使用 scrapy.log.msg() 方法記錄(log)message。 log中自動帶上該spider的 name 屬性。
    • closed(reason)
      當spider關閉時,該函數被調用。 該方法提供了一個替代調用signals.connect()來監聽 spider_closed 信號的快捷方式。
    • custom_settings
      內置設定。
    • crawler
      這個方法是被from_crawler調用的。
    • settings
    • from_crawler(crawler, *args, **kwargs)
      用來創建一個spiders的,可以不用覆蓋它,默認會去掉用__init__方法。
    CrawlSpider
    class scrapy.contrib.spiders.CrawlSpider

    爬取一般網站常用的spider。其定義了一些規則(rule)來提供跟進link的方便的機制。 也許該spider并不是完全適合您的特定網站或項目,但其對很多情況都使用。 因此您可以以其為起點,根據需求修改部分方法。當然您也可以實現自己的spider。
    除了從Spider繼承過來的(您必須提供的)屬性外,其提供了新的屬性:

    • rules
      一個包含一個(或多個) Rule 對象的集合(list)。 每個 Rule 對爬取網站的動作定義了特定表現。 Rule對象在下邊會介紹。 如果多個rule匹配了相同的鏈接,則根據他們在本屬性中被定義的順序,第一個會被使用。

    該spider也提供了一個可復寫(overrideable)的方法:

    • parse_start_url(response)
      當start_url的請求返回時,該方法被調用。 該方法分析最初的返回值并必須返回一個 Item 對象或者 一個 Request 對象或者 一個可迭代的包含二者對象。
    爬取規則(Crawling rules)
    class scrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)
    • link_extractor:是一個 Link Extractor 對象。 其定義了如何從爬取到的頁面提取鏈接。
    • callback:是一個callable或string(該spider中同名的函數將會被調用)。 從link_extractor中每獲取到鏈接時將會調用該函數。該回調函數接受一個response作為其第一個參數, 并返回一個包含 Item 以及(或) Request 對象(或者這兩者的子類)的列表(list)。
    • cb_kwargs:包含傳遞給回調函數的參數(keyword argument)的字典。
    • follow:是一個布爾(boolean)值,指定了根據該規則從response提取的鏈接是否需要跟進。 如果 callback 為None, follow 默認設置為 True ,否則默認為 False 。
    • process_links:是一個callable或string(該spider中同名的函數將會被調用)。 從link_extractor中獲取到鏈接列表時將會調用該函數。該方法主要用來過濾。
    • process_request:是一個callable或string(該spider中同名的函數將會被調用)。 該規則提取到每個request時都會調用該函數。該函數必須返回一個request或者None。 (用來過濾request)
    CrawlSpider樣例
    import scrapy from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractorclass MySpider(CrawlSpider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com']rules = (# 提取匹配 'category.php' (但不匹配 'subsection.php') 的鏈接并跟進鏈接(沒有callback意味著follow默認為True)Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),# 提取匹配 'item.php' 的鏈接并使用spider的parse_item方法進行分析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

    該spider將從example.com的首頁開始爬取,獲取category以及item的鏈接并對后者使用 parse_item 方法。 當item獲得返回(response)時,將使用XPath處理HTML并生成一些數據填入 Item 中。

    先了解一下。。
    https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/spiders.html#scrapy.spider.Spider.allowed_domains

    總結

    以上是生活随笔為你收集整理的Python 爬虫框架Scrapy Spiders学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。