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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Scrapy——基本用法(命令行工具、Item、Spiders)

發(fā)布時(shí)間:2023/12/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scrapy——基本用法(命令行工具、Item、Spiders) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

命令行工具

創(chuàng)建項(xiàng)目

scrapy startproject myproject

該命令經(jīng)會(huì)在myproject目錄中創(chuàng)建一個(gè)Scrapy項(xiàng)目。進(jìn)入到項(xiàng)目根目錄,就可以使用scrapy命令來(lái)管理和控制你的項(xiàng)目了。
控制項(xiàng)目
有些Scrapy命令要求在Scrapy項(xiàng)目中運(yùn)行。另外注意,有些命令在項(xiàng)目里運(yùn)行時(shí)的效果有些區(qū)別。

scrapy <command> -h

查看所有可用命令

scrapy -h

Scrapy提供了兩種類(lèi)型的命令。一種是必須在scrapy項(xiàng)目中運(yùn)行,另一種則不與需要。

全局命令:

命令語(yǔ)法功能
startprojectscrapy startproject [project_name]創(chuàng)建項(xiàng)目
settingsscrapy settings [options]在項(xiàng)目中運(yùn)行時(shí),該命令將會(huì)輸出醒目的設(shè)定值,否則輸出Scrapy默認(rèn)設(shè)定
runspiderscrapy runspider spider_file.py在未創(chuàng)建項(xiàng)目的情況下,運(yùn)行一個(gè)在Python文件中的spider
shellscrapy shell [url]以給定的URL或者空啟動(dòng)Scrapy
fetchscrapy fetch [url]使用Scrapy下載器下載給定的URL,并將獲取到的內(nèi)容送到標(biāo)準(zhǔn)輸出。
viewscrapy view [url]在瀏覽器中打開(kāi)給定的URL,并以Scrapy spider獲取到的形式展現(xiàn),可以用來(lái)檢查spider所獲取到的頁(yè)面
versionscrapy version [-v]輸出scrapy版本,配合-v運(yùn)行時(shí),該命令將同時(shí)輸出python,Twisted以及平臺(tái)的信息,方便bug提交

項(xiàng)目命令 |命令|語(yǔ)法|功能| |-|-| |crawl|`scrapy crawl `|使用spider進(jìn)行爬取| |check|`scrapy check [-l] `|運(yùn)行contract檢查| |list|scrapy list|列出當(dāng)前項(xiàng)目種所有可用的spider| |edit|`scrapy edit `|使用EDITOR種設(shè)定的編輯器給定的spider| |parse|`scrapy parse [options]`|獲取給定的URL并使用響應(yīng)的spider分析處理。| |genspider|`scrapy genspider [-t template] `|僅僅是創(chuàng)建spider的一種快捷方法。該方法可以用提前定義好的模板來(lái)生成spider,也可以自己創(chuàng)建spider的源碼文件| |deploy|`scrapy deploy [ | -l | -L ]`|將項(xiàng)目部署到Scrapyd服務(wù)| |bench|`scrapy bench`|運(yùn)行benchmark測(cè)試|

parse命令參數(shù)選項(xiàng)

  • –spider=SPIDER:跳過(guò)自動(dòng)檢測(cè)spider并強(qiáng)制使用特定的spider;
  • –a NAME=VALUE:設(shè)置spider的參數(shù)
  • –callback-cspider中用于解析返回的回調(diào)函數(shù)
  • –pipelines:在pipeline中處理item
  • –rules-r:使用CrawlSpider規(guī)則來(lái)發(fā)現(xiàn)用來(lái)解析返回的回調(diào)函數(shù)
  • –noitems不顯示爬取道的item
  • –nolinks不顯示爬取到的鏈接
  • –nocolour避免使用pygments對(duì)輸出著色
  • –depth-d指定跟進(jìn)鏈接誒請(qǐng)求的層數(shù)默認(rèn)為1
  • –verbose-v顯示每個(gè)請(qǐng)求的詳細(xì)信息

Items

爬取的主要目的就是從非結(jié)構(gòu)性的數(shù)據(jù)源提取結(jié)構(gòu)性數(shù)據(jù)。Scrapy提供Item類(lèi)來(lái)滿(mǎn)足這樣的需求。Item對(duì)象是種簡(jiǎn)單的容器,保存了爬取到的數(shù)據(jù)。其提供了類(lèi)似于字典的API以及用于聲明可用字段的簡(jiǎn)單語(yǔ)法。
聲明Item

class Product(scrapy.Item):name=scrapy.Field()price=scrapy.Field()stock=scrapy.Field()last_updated=scrapy.Field(serializer=str)

Item字段
Field對(duì)象指明了每個(gè)字段的元數(shù)據(jù)。你可以為每個(gè)字段指明任何類(lèi)型的元數(shù)據(jù)。設(shè)置Field對(duì)象的主要目的就是在一個(gè)地方定義好所有的元數(shù)據(jù)。
與Item配合
創(chuàng)建item

>>> product = Product(name='Desktop PC', price=1000) >>> print product Product(name='Desktop PC', price=1000)

獲取字段值

>>> product['name'] Desktop PC >>> product.get('name') Desktop PC>>> product['price'] 1000>>> product['last_updated'] Traceback (most recent call last):... KeyError: 'last_updated'>>> product.get('last_updated', 'not set') not set>>> product['lala'] # getting unknown field Traceback (most recent call last):... KeyError: 'lala'>>> product.get('lala', 'unknown field') 'unknown field'>>> 'name' in product # is name field populated? True>>> 'last_updated' in product # is last_updated populated? False>>> 'last_updated' in product.fields # is last_updated a declared field? True>>> 'lala' in product.fields # is lala a declared field? False

設(shè)置字段值

>>> product['last_updated'] = 'today' >>> product['last_updated'] today>>> product['lala'] = 'test' # setting unknown field Traceback (most recent call last):... KeyError: 'Product does not support field: lala'

獲取所有獲取到的值

print product.keys()# ['price', 'name']print product.items()# [('price', 1000), ('name', 'Desktop PC')]

復(fù)制item

product2=Product(product)print product2 # {'name': 'Desktop PC', 'price': 1000}product3=product2.copy()print product3 # {'name': 'Desktop PC', 'price': 1000}

根據(jù)item創(chuàng)建字典

print dict(product)# {'price': 1000, 'name': 'Desktop PC'}

根據(jù)字典創(chuàng)建item

print Product({'name': 'Laptop PC', 'price': 1500}) # {'name': 'Laptop PC', 'price': 1500}

擴(kuò)展Item
可以通過(guò)繼承原始的Item來(lái)擴(kuò)展item

class DiscountedProduct(Product):discount_percent = scrapy.Field(serializer=str)discount_expiration_date = scrapy.Field()

也可以通過(guò)使用原字段的元數(shù)據(jù),添加新的值或修改原來(lái)的值來(lái)擴(kuò)展字段元數(shù)據(jù)。

class SpecificProduct(Product):name = scrapy.Field(Product.fields['name'], serializer=my_serializer)

Item對(duì)象

class scrapy.item.Item([arg])

返回一個(gè)根據(jù)給定參數(shù)可選初始化的item,Item讀值了標(biāo)準(zhǔn)的dict API。包括初始化函數(shù)也相同,為以額外添加的屬性是:field,一個(gè)包含了所有聲明的字段的字典,而不僅僅是貨渠道的字段。

Spiders

Spider類(lèi)定義了如何爬取某個(gè)網(wǎng)站,包括了爬取的動(dòng)作以及如何從網(wǎng)頁(yè)的內(nèi)容中提取結(jié)構(gòu)化數(shù)據(jù)。還句話說(shuō),Spider就是你定義爬取的動(dòng)作及分析某個(gè)網(wǎng)頁(yè)的地方。

  • 以初始的URL初始化Request,并設(shè)置回調(diào)函數(shù)。當(dāng)該request下載完畢并返回時(shí),將生成response,并作為參數(shù)傳給該回調(diào)函數(shù)。start_requests()讀取start_urls中的URL,并以parse為回調(diào)函數(shù)生成Request.
  • 在回調(diào)函數(shù)內(nèi)分析返回的網(wǎng)頁(yè)內(nèi)容,返回Item對(duì)象或者Request或者一個(gè)包含二者的可迭代容器。返回的Request對(duì)象之后回經(jīng)過(guò)Scrapy處理,下載相應(yīng)的內(nèi)容,并調(diào)用設(shè)置的callback函數(shù)。
  • 在回調(diào)函數(shù)內(nèi),你可以使用選擇器來(lái)分析網(wǎng)頁(yè)內(nèi)容,并根據(jù)分析的數(shù)據(jù)生成item。
  • 最后,由spider返回的item將被存到數(shù)據(jù)庫(kù)或使用Feed exports存到文件中。

Spider參數(shù)
Spider可以通過(guò)接收參數(shù)來(lái)修改其功能。spider參數(shù)一般用來(lái)定義初始URL或者指定先值爬取網(wǎng)站的部分。
在運(yùn)行crawl時(shí)添加-a可以傳遞Spider參數(shù):

scrapy crawl myspider -a category=electronics

Spider在構(gòu)造器中獲取參數(shù)。

import scrapyclass MySpider(Spider):name = 'myspider'def __init__(self, category=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.start_urls = ['http://www.example.com/categories/%s' % category]# ...

Spider

class scrapy.spider.Spider

Spider是最簡(jiǎn)單的spider。每個(gè)器它的spider必須繼承自該類(lèi)。Spider僅僅請(qǐng)求給定的
start_urls/start_requests,并根據(jù)返回的結(jié)果(resulting/responses)調(diào)用spider的parse方法。

  • **name:**定義spider名字的字符串。定義了Scrapy如何定位spider,必須是唯一的。不過(guò)可以生成多個(gè)相同的spider實(shí)例。
    如果該spider爬取單個(gè)網(wǎng)站,一個(gè)常見(jiàn)的做法是以該網(wǎng)站來(lái)命名spider。
  • **allowed_domains:**可選,包含了spider允許爬取的域名列表。當(dāng)offsiteMiddleware啟用時(shí),域名不在列表中的URL不會(huì)被跟進(jìn)。
  • **start_urls:**URL列表,當(dāng)沒(méi)有制定特定的URL時(shí),spider將從該列表中來(lái)時(shí)進(jìn)行爬取。因此,第一個(gè)被獲取到的頁(yè)面的URL將是該列表之一。后續(xù)的URL將會(huì)從獲取到的數(shù)據(jù)中提取。
  • **start_requests()?*該方法必須返回一個(gè)可迭代對(duì)象。該對(duì)象包含了spider用于爬取的第一個(gè)Request。當(dāng)spider啟動(dòng)爬取并且未指定URL時(shí),該方法被調(diào)用。當(dāng)指定了URL時(shí),make_requests_from_url()將被調(diào)用來(lái)創(chuàng)建Request對(duì)象。僅近乎uibei調(diào)用一次,可視為生成器。該方法默認(rèn)使用start_urls的url生成Reqest。如果你想修改最初爬取某個(gè)網(wǎng)站的Request對(duì)象,可以重寫(xiě)該方法。
  • **make_requests_from_url(url)?*該方法接收一個(gè)URL并返回用于爬取的Request對(duì)象。在初始化時(shí)被start_requests()調(diào)用,也用于轉(zhuǎn)化url為request。默認(rèn)未被復(fù)寫(xiě)的情況下該方法返回的Request對(duì)象中,parse()作為回調(diào)函數(shù),dont_filter參數(shù)也被設(shè)置為開(kāi)啟。
  • **parse(respone)?*當(dāng)response沒(méi)有指定回調(diào)函數(shù)時(shí),該方法時(shí)Scapy處理下載的response的默認(rèn)方法。
    parse負(fù)責(zé)處理respones并返回處理的數(shù)據(jù)以及跟進(jìn)的URL。
    Spider對(duì)其他的Request及Item的可迭代的對(duì)象。
  • **log(message[,level,component]):*使用scrapy.log.msg()方法記錄message。log中自動(dòng)帶上該spider的name屬性。
  • **closed(reason)?*當(dāng)spider關(guān)閉時(shí),該函數(shù)被調(diào)用。該方法提供了一個(gè)提到調(diào)用signals.connect()來(lái)監(jiān)聽(tīng)spider_closed信號(hào)的快捷方式。
    樣例
import scrapyclass MySpider(scrapy.Spider):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):self.log('A response from %s just arrived!' % response.url)

CrawlSpider

class scrapy.contrib.spiders.CrawlSpider

爬取一般網(wǎng)站常用的spider。其定義了一些規(guī)則來(lái)提供跟link的方便機(jī)制。除了繼承過(guò)來(lái)的屬性外,其提供了一個(gè)新的屬性。

  • **rules:**一個(gè)包含一個(gè)或多個(gè)Rule對(duì)象的集合。每個(gè)Rule對(duì)爬取網(wǎng)站的動(dòng)作定義了特定的表現(xiàn)。如果rule匹配了相同的鏈接,則根據(jù)它們?cè)诒緦傩灾斜欢x的順序,第一個(gè)會(huì)被使用。
  • **parse_start_url(response)?*當(dāng)start_url的請(qǐng)求返回時(shí),該方法被調(diào)用。該方法分析最初的返回值并必須返回一個(gè) Item 對(duì)象或者 一個(gè) Request 對(duì)象或者 一個(gè)可迭代的包含二者對(duì)象。

爬取規(guī)則(Crawling rules)

class scrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)
  • link_extractor是一個(gè)Link Extractor對(duì)象,其定義了如何從爬取到的頁(yè)面提取鏈接。
  • callback是一個(gè)callable或string。從link_extractor中每獲取到鏈接時(shí)將調(diào)用該函數(shù)。該回調(diào)函數(shù)接受一個(gè)response作為其第一個(gè)參數(shù),并返回一個(gè)包含Itm以及Request對(duì)象的列表。
  • cb_kwargs:包含傳遞給回調(diào)函數(shù)的參數(shù)的字典。
  • follow是一個(gè)布爾值,指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進(jìn)。如果callback為None,follow默認(rèn)設(shè)置為T(mén)rue,否則默認(rèn)為False。
  • process_link是一個(gè)callable或string。主要用來(lái)過(guò)濾。
  • process_reqeust是一個(gè)callable或string。該規(guī)則提取到每個(gè)request時(shí)都會(huì)調(diào)用該函數(shù)。該函數(shù)必須返回一個(gè)request或None.
# coding:utf-8import 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') 的鏈接并跟進(jìn)鏈接(沒(méi)有callback意味著follow默認(rèn)為T(mén)rue)Rule(LinkExtractor(allow=('category\.php'),deny=('subsection\.php'))),# # 提取匹配 'item.php' 的鏈接并使用spider的parse_item方法進(jìn)行分析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的首頁(yè)開(kāi)始爬取,獲取category以及item的鏈接并對(duì)后者使用parse_item方法。當(dāng)item獲得返回時(shí),將使用XPath處理HTML并生成一些數(shù)據(jù)填入Item中。
XMLFeedSpider

class scrapy.contrib.spiders.XMLFeedSpider

XMLFeedSpider被設(shè)計(jì)用于通過(guò)迭代各個(gè)節(jié)點(diǎn)來(lái)分析XML源。迭代其可以從iternodes,xml,html選擇。鑒于xml以及html迭代器需要先讀取所有DOM再分析而引起的性能問(wèn)題,一般還是推薦使用iternodes。

你必須定義下列類(lèi)屬性來(lái)設(shè)置迭代器以及標(biāo)簽名:

**iterator:**用于確定使用哪個(gè)迭代器,

  • iternodes-一個(gè)高性能的基于正則表達(dá)式的迭代器;
  • html'-使用selector的迭代器。使用DOM進(jìn)行分析,其需要將所有的DOM載入內(nèi)存,當(dāng)數(shù)據(jù)量大的時(shí)候會(huì)產(chǎn)生問(wèn)題。
  • xml-和html一樣。
    默認(rèn)值為iternodes。

itertag一個(gè)包含開(kāi)始迭代的節(jié)點(diǎn)名的sring。
namespaces一個(gè)由(prefix,url)元組所組成的list。其定義了在該文檔中會(huì)被spider處理的可用的namespace。prefix及url會(huì)被自動(dòng)調(diào)用redister_namespace()生成namespace??梢酝ㄟ^(guò)itertag屬性中制定節(jié)點(diǎn)的namespace。

class YourSpider(XMLFeedSpider):namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]itertag = 'n:url'# ...

**adapt_response(response)**該方法在spider分析response前被調(diào)用??梢栽趓esponse被分析前使用該函數(shù)來(lái)修改內(nèi)容。
**parse_node(response, selector)**當(dāng)節(jié)點(diǎn)符合提供的標(biāo)簽名時(shí)itertag該方法被調(diào)用。接收到的response以及相應(yīng)的Selector作為參數(shù)傳遞給該方法。該方法返回一個(gè)Item對(duì)象或者Request對(duì)象或者一個(gè)包含二者的可迭代對(duì)象。
**process_results(response, results)**當(dāng)spider返回結(jié)果時(shí)該方法被調(diào)用。設(shè)定該方法的目的是在結(jié)果返回給框架核心之前作最后的處理。

from scrapy import log from scrapy.contrib.spiders import XMLFeedSpider from myproject.items import TestItemclass MySpider(XMLFeedSpider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com/feed.xml']iterator = 'iternodes' # This is actually unnecessary, since it's the default valueitertag = 'item'def parse_node(self, response, node):log.msg('Hi, this is a <%s> node!: %s' % (self.itertag, ''.join(node.extract())))item = TestItem()item['id'] = node.xpath('@id').extract()item['name'] = node.xpath('name').extract()item['description'] = node.xpath('description').extract()return item

CSVFeedSpider
用來(lái)爬取CSV文件網(wǎng)頁(yè)

class scrapy.contrib.spiders.CSVFeedSpider

該spider除了其按行遍歷而不是節(jié)點(diǎn)之外其他和XMLFeedSpider十分類(lèi)似,而每次迭代時(shí)調(diào)用的是parse_row().

delimiter在CSV文件中用于區(qū)分字段的分隔符。類(lèi)型為string。默認(rèn)為’,’;

headers在CSV文件中包含的用來(lái)提取字段的行的列表。
**parse_row(response,row)**該方法接收一個(gè)response對(duì)象及一個(gè)以提供或檢測(cè)出來(lái)的header為鍵的字典。該spider中,你可以覆蓋adapt_response及process_results方法來(lái)進(jìn)行預(yù)處理及后處理。

from scrapy import log from scrapy.contrib.spiders import CSVFeedSpider from myproject.items import TestItemclass MySpider(CSVFeedSpider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com/feed.csv']delimiter = ';'headers = ['id', 'name', 'description']def parse_row(self, response, row):log.msg('Hi, this is a row!: %r' % row)item = TestItem()item['id'] = row['id']item['name'] = row['name']item['description'] = row['description']

SitemapSpider

class scrapy.contrib.spiders.SitemapSpider

SitemapSpider使你爬取網(wǎng)站時(shí)可以通過(guò)Sitemaps來(lái)發(fā)現(xiàn)爬取的URL。其支持嵌套的sitemap,并能從robots.txt會(huì)獲取sitemap的url。

sitemap_urls包含你要爬取的url的sitemap的url列表。也可以指定為一個(gè)robots.txt,spider會(huì)從中分析并提取url。
sitemap_rules一個(gè)包含(regex,callback)元組的列表。

  • regex是一個(gè)用于匹配從sitemap提供的url的正則表達(dá)式;可以是一個(gè)字符串或者編譯的正則對(duì)象。
  • callback指定了匹配正則表達(dá)式的url的處理函數(shù)。可以是一個(gè)字符串或者callale。規(guī)則按順序進(jìn)行匹配,之后第一個(gè)匹配才會(huì)被應(yīng)用。如果忽略該屬性,sitemap中發(fā)現(xiàn)的所有url將會(huì)被parse函數(shù)處理。
  • sitemap_follow一個(gè)用于匹配要跟進(jìn)的sitemap的正則表達(dá)式的列表。其僅僅被應(yīng)用在使用Sitemap index files來(lái)指向其他sitemap文件的站點(diǎn)。默認(rèn)情況下所有的sitemap都回被跟進(jìn)。
  • sitemap_alternate_links指定當(dāng)一個(gè)url又可選的鏈接時(shí),是否跟進(jìn)。有些非英文網(wǎng)站會(huì)在一個(gè)url塊內(nèi)提供其他語(yǔ)言的網(wǎng)站鏈接。
<url><loc>http://example.com/</loc><xhtml:link rel="alternate" hreflang="de" href="http://example.com/de"/> </url>

當(dāng) sitemap_alternate_links 設(shè)置時(shí),兩個(gè)URL都會(huì)被獲取。 當(dāng) sitemap_alternate_links 關(guān)閉時(shí),只有 http://example.com/ 會(huì)被獲取。默認(rèn) sitemap_alternate_links 關(guān)閉。
樣例
使用parse處理通過(guò)sitemap發(fā)現(xiàn)的所有url:

from scrapy.contrib.spiders import SitemapSpiderclass MySpider(SitemapSpider):sitemap_urls = ['http://www.example.com/sitemap.xml']def parse(self, response):pass # ... scrape item here ...

用特定的函數(shù)處理某些url,其他的使用另外的callback:

from scrapy.contrib.spiders import SitemapSpiderclass MySpider(SitemapSpider):sitemap_urls = ['http://www.example.com/sitemap.xml']sitemap_rules = [('/product/', 'parse_product'),('/category/', 'parse_category'),]def parse_product(self, response):pass # ... scrape product ...def parse_category(self, response):pass # ... scrape category ...

跟進(jìn)robots.txt文件定義的sitemap并只跟進(jìn)包含有…sitemap_shop的url:

from scrapy.contrib.spiders import SitemapSpiderclass MySpider(SitemapSpider):sitemap_urls = ['http://www.example.com/robots.txt']sitemap_rules = [('/shop/', 'parse_shop'),]sitemap_follow = ['/sitemap_shops']def parse_shop(self, response):pass # ... scrape shop here ...

在SitemapSpider中使用其他url:

from scrapy.contrib.spiders import SitemapSpiderclass MySpider(SitemapSpider):sitemap_urls = ['http://www.example.com/robots.txt']sitemap_rules = [('/shop/', 'parse_shop'),]other_urls = ['http://www.example.com/about']def start_requests(self):requests = list(super(MySpider, self).start_requests())requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]return requestsdef parse_shop(self, response):pass # ... scrape shop here ...def parse_other(self, response):pass # ... scrape other here ...

總結(jié)

以上是生活随笔為你收集整理的Scrapy——基本用法(命令行工具、Item、Spiders)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。