经常问的问题
Scrapy与BeautifulSoup或lxml相比如何?
BeautifulSoup和lxml是解析HTML和XML的库。 Scrapy是一个应用程序框架,用于编写抓取网站并从中提取数据的网络蜘蛛。
Scrapy提供了一种用于提取数据(称为选择器)的内置机制,但如果您觉得更舒服,可以轻松使用BeautifulSoup(或lxml)。毕竟,他们只是解析可以从任何Python代码导入和使用的库。
换句话说,将BeautifulSoup(或lxml)与Scrapy进行比较就像将jinja2与Django进行比较。
我可以用BeautifulSoup Scrapy吗?
是的你可以。如上所述,BeautifulSoup可用于在Scrapy回调中解析HTML响应。您只需将响应的正文加入到BeautifulSoup对象中,并从中提取所需的任何数据。
这里有一个使用BeautifulSoup API的蜘蛛示例,使用lxml作为HTML解析器:
从bs4导入BeautifulSoup
进口刮板
ExampleSpider(scrapy.Spider):
name =“example”
allowed\_domains = \[“example.com”\]
start\_urls =(
'http://www.example.com/',
)
def解析(self,response):
#使用lxml获得体面的HTML解析速度
soup = BeautifulSoup(response.text,'lxml')
产量 {
“url”:response.url,
“title”:soup.h1.string
}
注意
BeautifulSoup支持多个HTML / XML解析器。请参阅BeautifulSoup的官方文档。
Scrapy支持什么Python版本?
Python 2.7和Python 3.3+支持Scrapy。 Python 2.6的支持从Scrapy 0.20开始下降。在Scrapy 1.1中添加了Python 3支持。
注意
对于Windows上的Python 3支持,建议按照安装指南中的说明使用Anaconda / Miniconda。
从Django“Scr”“X”?
可能,但我们不喜欢这个词。我们认为Django是一个很好的开源项目和一个例子,所以我们用它作为Scrapy的灵感。
我们认为,如果事情已经做好了,那就没有必要重新发明。这个概念除了是开源和自由软件的基础之外,不仅适用于软件,还适用于文档,程序,策略等。因此,我们不是自己来处理每个问题,而是从这些项目中复制想法已经妥善解决了,重点关注了我们需要解决的真正问题。
如果Scrapy作为其他项目的灵感,我们将感到自豪。随意窃取我们!
Scrapy是否与HTTP代理协同工作?
是。通过HTTP代理下载器中间件提供对HTTP代理的支持(从Scrapy 0.8开始)。请参阅HttpProxyMiddleware。
如何在不同页面中划分属性的项目?
请参阅将其他数据传递给回调函数。
Scrapy崩溃:ImportError:没有名为win32api的模块
由于这个Twisted错误,您需要安装pywin32。
如何模拟用户登录我的蜘蛛?
请参阅使用FormRequest.from_response()来模拟用户登录。
Scrapy是否以广度优先或深度优先顺序爬行?
默认情况下,Scrapy使用LIFO队列来存储挂起的请求,这基本上意味着它以DFO顺序爬行。在大多数情况下,这个顺序更方便。如果您想要以真实的BFO顺序进行爬网,则可以通过设置以下设置来进行操作:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE ='scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE ='scrapy.squeues.FifoMemoryQueue'
我的Scrapy爬虫有内存泄漏。我能做什么?
请参阅调试内存泄漏。
此外,Python还有一个内置的内存泄漏问题,这个漏洞在泄漏中被描述。
如何使Scrapy消耗更少的记忆力?
看到上一个问题。
我可以在我的蜘蛛中使用基本HTTP身份验证吗?
是的,请参阅HttpAuthMiddleware。
为什么Scrapy以英语代替我的母语下载页面?
尝试通过覆盖DEFAULT_REQUEST_HEADERS设置来更改默认的Accept-Language请求头。
在哪里可以找到一些例子Scrapy项目?
参见示例。
我可以在不创建项目的情况下运行蜘蛛吗?
是。您可以使用runspider命令。例如,如果你有一个spider写在my_spider.py文件中,你可以运行它:
scrapy runspider my_spider.py
有关详细信息,请参阅runspider命令。
我收到“过滤的异地请求”消息。我该如何解决?
那些消息(用DEBUG级别记录)并不一定意味着有一个问题,所以你可能不需要修复它们。
这些消息由Offsite Spider Middleware抛出,该中间件是一个蜘蛛中间件(默认启用),其目的是过滤掉对蜘蛛覆盖的域外的请求。
欲了解更多信息,请参阅:OffsiteMiddleware。
在生产中部署Scrapy履带的推荐方法是什么?
请参阅部署蜘蛛。
我可以使用JSON进行大量出口吗?
这取决于你的输出有多大。请参阅JsonItemExporter文档中的此警告。
我可以从信号处理程序中返回(扭转)延期吗?
一些信号支持从他们的处理程序返回延期,而其他信号则不支持。看到内置的信号参考,知道哪些。
响应状态代码999是什么意思?
999是Yahoo网站用于调整请求的自定义响应状态代码。尝试使用您的蜘蛛中的2(或更高版本)的下载延迟降低爬网速度:
MySpider类(CrawlSpider):
name ='myspider'
download\_delay = 2
#\[...其余的蜘蛛代码...\]
或者通过DOWNLOAD_DELAY设置在项目中设置全局下载延迟。
我可以从我的蜘蛛调用pdb.set_trace()来调试它们吗?
是的,但您也可以使用Scrapy shell,您可以快速分析(甚至修改)蜘蛛正在处理的响应(通常比普通旧的pdb.set_trace())更有用。
有关详细信息,请参阅从蜘蛛调用shell以检查响应。
最简单的方法是将我所有的被废弃的项目转储成JSON / CSV / XML文件?
要转储到JSON文件中:
抓取抓取myspider -o items.json
要转储到CSV文件中:
刮擦爬行myspider -o items.csv
要转储到XML文件中:
scrapy crawl myspider -o items.xml
有关更多信息,请参阅Feed导出
这个巨大的隐含的__VIEWSTATE参数在某些形式中使用了什么?
__VIEWSTATE参数用于使用ASP.NET / VB.NET构建的站点。有关如何工作的更多信息,请参阅此页面。另外,这里是一个蜘蛛,其中一个这样的网站。
解析大型XML / CSV数据Feed的最佳方式是什么?
使用XPath选择器解析大型Feed可能是有问题的,因为它们需要在内存中构建整个Feed的DOM,这可能相当慢,并且消耗大量内存。
为了避免在内存中一次性解析所有的整个Feed,您可以使用scrapy.utils.iterators模块中的xmliter和csviter函数。事实上,这是饲料蜘蛛(见蜘蛛)在封面下使用的。
Scrapy是否自动管理cookies?
是的,Scrapy接收和跟踪服务器发送的Cookie,并按照任何常规的网络浏览器将其发送回后续请求。
有关更多信息,请参阅请求和响应和CookiesMiddleware。
如何查看从Scrapy发送和接收的Cookie?
启用COOKIES_DEBUG设置。
如何指示蜘蛛停止自己?
从回调中提高CloseSpider异常。欲了解更多信息,请参阅:CloseSpider。
如何防止我的Scrapy bot被禁止?
请参阅避免被禁止。
我应该使用蜘蛛参数或设置来配置我的蜘蛛吗?
蜘蛛参数和设置都可用于配置您的蜘蛛。没有严格的规则要求使用一个或另一个,但是设置更适合于一旦设置的参数变化不大,而蜘蛛参数意味着更频繁地更改,即使在每个蜘蛛运行中,有时也是所有蜘蛛都需要运行(例如,设置蜘蛛的起始网址)。
为了说明一个例子,假设你有一个蜘蛛需要登录到一个站点来刮取数据,而你只想从网站的某个部分(每次都有所不同)中删除数据。在这种情况下,登录的凭据将是设置,而要删除的部分的URL将是一个蜘蛛的参数。
我正在刮一个XML文档,我的XPath选择器不返回任何项目
您可能需要删除命名空间。请参阅删除命名空间。