# 常見問題
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
## Scrapy與BeautifulSoup或LXML相比如何?
[BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) 和 [lxml](http://lxml.de/) 是用于分析HTML和XML的庫。Scrapy是一個應用程序框架,用于編寫爬行網站并從中提取數據的網絡 Spider 。
Scrapy提供了一個用于提取數據的內置機制(稱為 [selectors](topics/selectors.html#topics-selectors) )但是你可以很容易地使用 [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) (或) [lxml](http://lxml.de/) )相反,如果你覺得和他們一起工作更舒服的話。畢竟,它們只是解析可以從任何Python代碼導入和使用的庫。
換句話說,比較 [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) (或) [lxml](http://lxml.de/) )剪貼就像比較 [jinja2](http://jinja.pocoo.org/) 到 [Django](https://www.djangoproject.com/) .
## 我可以用 Scrapy 和 BeautifulSoup 嗎?
是的,你可以。如上所述 [above](#faq-scrapy-bs-cmp) , [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) 可用于分析Scrapy回調中的HTML響應。你只需要把反應的身體 `BeautifulSoup` 對象并從中提取所需的任何數據。
下面是一個使用BeautifulSoupAPI的 Spider 示例, `lxml` 作為HTML解析器:
```py
from bs4 import BeautifulSoup
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = (
'http://www.example.com/',
)
def parse(self, response):
# use lxml to get decent HTML parsing speed
soup = BeautifulSoup(response.text, 'lxml')
yield {
"url": response.url,
"title": soup.h1.string
}
```
注解
`BeautifulSoup` 支持多個HTML/XML分析器。見 [BeautifulSoup's official documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#specifying-the-parser-to-use) 哪些是可用的。
## Scrapy支持哪些Python版本?
scrappy在cpython(默認的python實現)和pypy(從pypy 5.9開始)下支持python 2.7和python 3.4+。python 2.6支持從scrapy 0.20開始被丟棄。Scrapy1.1中添加了python 3支持。在Scrapy 1.4中添加了Pypy支持,在Scrapy 1.5中添加了Pypy3支持。
注解
對于Windows上的python 3支持,建議使用anaconda/miniconda作為 [outlined in the installation guide](intro/install.html#intro-install-windows) .
## Scrapy 有沒有從 Django“steal”X?
可能吧,但我們不喜歡這個詞。我們認為django_u是一個偉大的開源項目,也是一個可以效仿的例子,所以我們把它作為scrappy的靈感來源。
我們相信,如果某件事已經做得很好,就沒有必要再去改造它。這個概念,除了作為開源和自由軟件的基礎之一,不僅適用于軟件,也適用于文檔、程序、政策等。因此,我們選擇從已經正確解決了這些問題的項目中復制想法,而不是自己解決每個問題,而是關注我們需要解決的實際問題。奧爾維。
如果Scrapy能為其他項目提供靈感,我們會感到驕傲。隨時從我們這里偷東西!
## Scrapy與HTTP代理一起工作嗎?
對。通過HTTP代理下載器中間件提供對HTTP代理的支持(因為scrapy 0.8)。見 [`HttpProxyMiddleware`](topics/downloader-middleware.html#scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware") .
## 如何在不同的頁面中抓取具有屬性的項目?
見 [向回調函數傳遞附加數據](topics/request-response.html#topics-request-response-ref-request-callback-arguments) .
## scrapy崩潰:importError:沒有名為win32api的模塊
您需要安裝 [pywin32](https://sourceforge.net/projects/pywin32/) 因為 [this Twisted bug](https://twistedmatrix.com/trac/ticket/3707) .
## 如何在 Spider 中模擬用戶登錄?
見 [使用formRequest.from_response()模擬用戶登錄](topics/request-response.html#topics-request-response-ref-request-userlogin) .
## 是寬度優先還是深度優先?
默認情況下,Scrapy使用 [LIFO](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) 用于存儲掛起請求的隊列,這基本上意味著它會爬入 [DFO order](https://en.wikipedia.org/wiki/Depth-first_search) . 這種訂單在大多數情況下更方便。如果你真的想爬進去 [BFO order](https://en.wikipedia.org/wiki/Breadth-first_search) ,您可以通過設置以下設置來完成此操作:
```py
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
```
## 我可憐的爬蟲有記憶漏洞。我能做什么?
見 [調試內存泄漏](topics/leaks.html#topics-leaks) .
另外,python還有一個內置的內存泄漏問題,如中所述。 [無泄漏泄漏](topics/leaks.html#topics-leaks-without-leaks) .
## 我怎么能讓 Scrapy 消耗更少的記憶?
請參閱前面的問題。
## 我可以在spider中使用基本的HTTP身份驗證嗎?
是的,看到了 [`HttpAuthMiddleware`](topics/downloader-middleware.html#scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware "scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware") .
## 為什么Scrapy用英語而不是我的母語下載頁面?
嘗試更改默認值 [Accept-Language](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4) request header by overriding the [`DEFAULT_REQUEST_HEADERS`](topics/settings.html#std:setting-DEFAULT_REQUEST_HEADERS) 設置。
## 我在哪里可以找到一些零碎項目的例子?
見 [實例](intro/examples.html#intro-examples) .
## 我可以在不創建項目的情況下運行 Spider 嗎?
對。你可以使用 [`runspider`](topics/commands.html#std:command-runspider) 命令。例如,如果有一個 Spider 用 `my_spider.py` 您可以用以下方式運行它的文件:
```py
scrapy runspider my_spider.py
```
見 [`runspider`](topics/commands.html#std:command-runspider) 命令獲取更多信息。
## 我收到“過濾的異地請求”消息。我怎么修理它們?
這些信息(記錄 `DEBUG` 級別)不一定意味著有問題,因此您可能不需要修復它們。
這些消息由非現場 Spider 中間件拋出,這是一個 Spider 中間件(默認情況下啟用),其目的是過濾掉對 Spider 所覆蓋域之外的域的請求。
有關詳細信息,請參閱: [`OffsiteMiddleware`](topics/spider-middleware.html#scrapy.spidermiddlewares.offsite.OffsiteMiddleware "scrapy.spidermiddlewares.offsite.OffsiteMiddleware") .
## 在生產中,建議采用什么方式部署 Scrapy 履帶?
見 [部署 Spider](topics/deploy.html#topics-deploy) .
## 我可以使用JSON進行大型出口嗎?
這取決于你的產出有多大。見 [this warning](topics/exporters.html#json-with-large-data) 在里面 [`JsonItemExporter`](topics/exporters.html#scrapy.exporters.JsonItemExporter "scrapy.exporters.JsonItemExporter") 文檔。
## 我可以從信號處理程序返回(扭曲)延遲嗎?
一些信號支持從其處理程序返回延遲,而另一些則不支持。請參見 [內置信號參考](topics/signals.html#topics-signals-ref) 去知道哪些。
## 響應狀態代碼999是什么意思?
999是雅虎網站用來限制請求的自定義響應狀態代碼。嘗試使用下載延遲來降低爬行速度 `2` (或更高)在你的 Spider :
```py
class MySpider(CrawlSpider):
name = 'myspider'
download_delay = 2
# [ ... rest of the spider code ... ]
```
或者通過在項目中設置全局下載延遲 [`DOWNLOAD_DELAY`](topics/settings.html#std:setting-DOWNLOAD_DELAY) 設置。
## 我可以調用嗎? `pdb.set_trace()` 從我的 Spider 身上調試它們?
是的,但是您也可以使用scriby shell,它允許您快速分析(甚至修改)您的spider正在處理的響應,這通常比普通的老版本更有用。 `pdb.set_trace()` .
有關詳細信息,請參閱 [從spiders調用shell來檢查響應](topics/shell.html#topics-shell-inspect-response) .
## 最簡單的方法是將我的所有抓取項轉儲到json/csv/xml文件中?
要轉儲到JSON文件,請執行以下操作:
```py
scrapy crawl myspider -o items.json
```
要轉儲到csv文件,請執行以下操作:
```py
scrapy crawl myspider -o items.csv
```
要轉儲到XML文件,請執行以下操作:
```py
scrapy crawl myspider -o items.xml
```
有關詳細信息,請參閱 [Feed 導出](topics/feed-exports.html#topics-feed-exports)
## 這個巨大的秘密是什么? `__VIEWSTATE` 某些形式中使用的參數?
這個 `__VIEWSTATE` 參數用于使用ASP.NET/VB.NET生成的網站。有關其工作方式的詳細信息,請參見 [this page](http://search.cpan.org/~ecarroll/HTML-TreeBuilderX-ASP_NET-0.09/lib/HTML/TreeBuilderX/ASP_NET.pm) . 還有,這里有一個 [example spider](https://github.com/AmbientLighter/rpn-fas/blob/master/fas/spiders/rnp.py) 會刮傷其中一個站點。
## 解析大型XML/CSV數據源的最佳方法是什么?
使用xpath選擇器解析大型提要可能會有問題,因為它們需要在內存中構建整個提要的DOM,這可能會非常慢,并且會消耗大量內存。
為了避免在內存中一次分析所有提要,可以使用函數 `xmliter` 和 `csviter` 從 `scrapy.utils.iterators` 模塊。事實上,這就是食性 Spider (參見 [Spider](topics/spiders.html#topics-spiders) )在蓋下使用。
## Scrapy是否自動管理cookies?
是的,Scrapy接收并跟蹤服務器發送的cookie,并像任何普通的Web瀏覽器一樣,在隨后的請求中發送它們。
有關詳細信息,請參閱 [請求和響應](topics/request-response.html#topics-request-response) 和 [CookiesMiddleware](topics/downloader-middleware.html#cookies-mw) .
## 我如何才能看到從Scrapy發送和接收的cookies?
啟用 [`COOKIES_DEBUG`](topics/downloader-middleware.html#std:setting-COOKIES_DEBUG) 設置。
## 我怎樣才能指示 Spider 停止自己呢?
提高 [`CloseSpider`](topics/exceptions.html#scrapy.exceptions.CloseSpider "scrapy.exceptions.CloseSpider") 回調異常。有關詳細信息,請參閱: [`CloseSpider`](topics/exceptions.html#scrapy.exceptions.CloseSpider "scrapy.exceptions.CloseSpider") .
## 我怎樣才能防止我的廢機器人被禁止?
見 [避免被禁止](topics/practices.html#bans) .
## 我應該使用 Spider 參數或設置來配置我的 Spider 嗎?
兩個 [spider arguments](topics/spiders.html#spiderargs) 和 [settings](topics/settings.html#topics-settings) 可以用來配置 Spider 。沒有strict的規則要求使用其中一個或另一個,但是設置更適合于參數,一旦設置,就不會改變太多,而spider參數的更改更頻繁,甚至在每次spider運行時,有時甚至需要spider運行(例如,設置spider的起始URL)。
舉個例子來說明,假設您有一個 Spider 需要登錄到一個站點來獲取數據,并且您只想從站點的某個部分(每次都不同)獲取數據。在這種情況下,登錄的憑證將是設置,而要擦除的部分的URL將是spider參數。
## 我正在抓取一個XML文檔,而我的xpath選擇器沒有返回任何項
可能需要刪除命名空間。見 [正在刪除命名空間](topics/selectors.html#removing-namespaces) .
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性