您现在的位置是:主页 > news > 做外贸需要独立网站/上海seo推广服务

做外贸需要独立网站/上海seo推广服务

admin2025/6/15 20:47:43news

简介做外贸需要独立网站,上海seo推广服务,发明迷网站豆渣做豆腐,昆明做网站竞价Common Practices 这部分记录了在使用scrapy是常用的做法,这包含了很多主题,而且通常不属于任何其他特定的部分。 Run Scrapy from a script 你可以在脚本中使用API来运行脚本,而不是通过scrapy crawl 这种普通的方式。 记得,…

做外贸需要独立网站,上海seo推广服务,发明迷网站豆渣做豆腐,昆明做网站竞价Common Practices 这部分记录了在使用scrapy是常用的做法,这包含了很多主题,而且通常不属于任何其他特定的部分。 Run Scrapy from a script 你可以在脚本中使用API来运行脚本,而不是通过scrapy crawl 这种普通的方式。 记得,…

Common Practices

这部分记录了在使用scrapy是常用的做法,这包含了很多主题,而且通常不属于任何其他特定的部分。

Run Scrapy from a script

你可以在脚本中使用API来运行脚本,而不是通过scrapy crawl 这种普通的方式。

记得,scrapy建立了Twisted异步联网库,所以你需要在Twisted reactor 中运行。

你用来运行你的爬虫的第一个使用程序是scrapy.crawler.CrawlerProcess,这个类会开启一个twisted reactor,配置日志并设置关闭处理器。这个类是所有scrapy 命令使用的。

Here’s an example showing how to run a single spider with it.

import scrapy
from scrapy.crawler import CrawlerProcessclass MySpider(scrapy.Spider):# Your spider definition...process = CrawlerProcess(settings={"FEEDS": {"items.json": {"format": "json"},},
})process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished

在CrawlerProcess中,定义的设置要是字典的形式,检查CrawlerProcess的文档来熟悉用法详情。

如果你所在的scrapy项目有额外的帮助程序,你可以使用来导入这些组件进项目。你可以自动的导入你的爬虫,传递他们的名字给CrawlerProcess,并使用get_project_settings来得到你项目 Settings的实例。

What follows is a working example of how to do that, using the testspiders project as example.

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settingsprocess = CrawlerProcess(get_project_settings())# 'followall' is the name of one of the spiders of the project.
process.crawl('followall', domain='scrapinghub.com')
process.start() # the script will block here until the crawling is finished

有其他的scrapy实用程序提供对抓取进程的更多的控制: scrapy.crawler.CrawlerRunner。这个类是一个简单的包装,封装了一些简单的帮助程序来运行多个的搜寻器,但是他不会以任何方式启动或干扰reactors。

使用这个类 reactor 应该准确的运行在调度你的爬虫后,推荐你使用CrawlerRunner instead of CrawlerProcess,如果你的应用已经使用了Twisted并且你想在同一个reactor中运行scrapy。

注意你可以在爬虫完成后自己关闭twisted reactor,通过增加回调函数给CrawlerRunner.crawl方法返回的deferred。

这个用法的例子,以及在myspider完成运行后使用回调函数手动停止reactor。

from twisted.internet import reactor
import scrapy
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_loggingclass MySpider(scrapy.Spider):# Your spider definition...configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
runner = CrawlerRunner()d = runner.crawl(MySpider)
d.addBoth(lambda _: reactor.stop())
reactor.run() # the script will block here until the crawling is finished

See also

Reactor Overview

Running multiple spiders in the same process

当你使用scrapy crawl时默认一个进程只运行一个爬虫。但是scrapy可以使用 internal API在每个进程中使用多个爬虫。

这是同时运行多个爬虫的例子。

import scrapy
from scrapy.crawler import CrawlerProcessclass MySpider1(scrapy.Spider):# Your first spider definition...class MySpider2(scrapy.Spider):# Your second spider definition...process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start() # the script will block here until all crawling jobs are finished

Same example using CrawlerRunner:

import scrapy
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_loggingclass MySpider1(scrapy.Spider):# Your first spider definition...class MySpider2(scrapy.Spider):# Your second spider definition...configure_logging()
runner = CrawlerRunner()
runner.crawl(MySpider1)
runner.crawl(MySpider2)
d = runner.join()
d.addBoth(lambda _: reactor.stop())reactor.run() # the script will block here until all crawling jobs are finished

相同的实例,但是通过连接延迟项依次运行爬虫。

from twisted.internet import reactor, defer
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_loggingclass MySpider1(scrapy.Spider):# Your first spider definition...class MySpider2(scrapy.Spider):# Your second spider definition...configure_logging()
runner = CrawlerRunner()@defer.inlineCallbacks
def crawl():yield runner.crawl(MySpider1)yield runner.crawl(MySpider2)reactor.stop()crawl()
reactor.run() # the script will block here until the last crawl call is finished

See also

Run Scrapy from a script.

Distributed crawls

scrapy不会提供任何内置功能来通过分布式运行爬虫(多个服务器)。但是这有一些方式来分布抓取,这取决于你怎样计划来分布他们。

如果你有很多爬虫,分配负载的最显然的方式就是建立许多scrapy实例,并且在这些分布运行爬虫

如果你想在许多机器上运行一个(大型)爬虫,你要对url进行分区爬取,并发送他们到每个分离的爬虫,这是一个具体的例子。

首先,你要准备爬取urls的列表并把他们放到分离的文件/urls中。

http://somedomain.com/urls-to-crawl/spider1/part1.list
http://somedomain.com/urls-to-crawl/spider1/part2.list
http://somedomain.com/urls-to-crawl/spider1/part3.list

然后再三个不同scrapy服务器上运行爬虫,爬虫会接受一个属性(spider的)part,里面有要抓取的部分的数字。

curl http://scrapy1.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=1
curl http://scrapy2.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=2
curl http://scrapy3.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=3

Avoiding getting banned

一些网站使用某些测试来阻止机器人抓取,具有不同程度的复杂性。绕开这些测试可能会很困难和棘手,并且可能使用特殊的基础结构。Please consider contacting commercial support if in doubt

再遇到这些网站时你要记得一些提示:

  • 从浏览器的知名用户代理池中轮换user agent (搜搜就行)
  • disable cookies (see COOKIES_ENABLED) as some sites may use cookies to spot bot behaviour# 禁用cookies ,有些网站使用cookies来识别机器人行为。
  • use download delays (2 or higher). See DOWNLOAD_DELAY setting.# 使用下载延迟。
  • 如果可以使用Google cache来缓存页面,而不是直接访问页面。
  • 使用轮换的ip池。例如,免费的Tor project 或付费的 ProxyMesh,还有开源的scrapoxy,你可以为你的代理附加个超级代理。。。
  • 使用高度分散的下载器,可以再内部回避禁止,所以你可以专注下载干净的页面,这类下载器的一个实例: Crawlera。

如果你仍然不能阻止你的机器被禁止,就考虑花钱吧。。commercial support.

Broad Crawls

在抓取指定网址时默认对scrapy进行优化。这些网址通常被一个scrapy爬虫处理,尽管这不是需要的也不是必须的(例如,有通用爬虫可以处理任何所给的网址)

除了集中抓取外,有另一种常用种类的抓取类型,他包括了大量的域名(可能无限),并且只受时间或其他任意约束的限制,而不是在域名抓取完成或没有请求执行时停止。这叫 broad crawls 这是搜索引擎使用的经典方法。

广泛爬取的通用特性:

  • 抓取很多域名(经常时无限的)而不是指定的网址集。
  • 不需要抓取域名到完成,因为这是不可能的,这是根据时间和页面数来限制抓取。
  • t在逻辑上很简单(与很多提取规则的复杂爬虫相反)因为数据通常在分离的阶段进行后在处理。
    -同时抓取很多域名,这让他们不受任何特别网址的限制而完成更快的爬取。(每个爬的很慢来保命,但是并发的数量多)

前面说过,scrapy默认的设置是对专一抓取的优化,而不是广泛抓取,然而,由于它的异步结构,scrapy也很适合执行快速的广泛抓取。这个页面总结了在使用广泛抓取时要记住的一些事情,以及未来完成高效广泛抓取而对scrapy设置进行调整的具体建议。

Use the right SCHEDULER_PRIORITY_QUEUE

scrapy默认的调度器优先级队列是'scrapy.pqueues.ScrapyPriorityQueue'.虽然在单一域名下运行的很好,但对于并行抓取多个域名就不行了。

使用推荐的优先级对列。

SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'

Increase concurrency

并发是同时处理请求的数量。有一个全局限制 (CONCURRENT_REQUESTS) 和一个额外的限制可以为每个域名(CONCURRENT_REQUESTS_PER_DOMAIN)或每个IP(CONCURRENT_REQUESTS_PER_IP)设置增加并发数。

Note

为广泛爬取推荐的调度器优先级队列不支持CONCURRENT_REQUESTS_PER_IP.

默认的全局并发数限制不适合并行抓取不同的域名,所以你要增加它。增加的大小取决于你抓取使用的CPU 和内存的大小。

A good starting point is 100:

CONCURRENT_REQUESTS = 100

最好的方法是通过一些测试和识别来看看你的scrapy进程并发使用的CPU的界限。最优化的性能是CPU使用率为80%-90%的并发。

增加并发也会增加内存的使用,如果你的内存不够,还是降低吧。

Increase Twisted IO thread pool maximum size

当前,scrapy使用线程池来阻止DNS解析。使用更高的并发级别抓取会变慢设置导致DNS解析器超时而失败。解决方法就是证据处理DNS查询的线程的数量。DNS队列会被更快处理,从而加快连接的建立和抓取总体的速度。

可以提升的最大值

REACTOR_THREADPOOL_MAXSIZE = 20

Setup your own DNS

如果你有大量的抓取进程和单一的核心DNS,这就会像Dos攻击DNS服务器一样,会导致整个网络变慢甚至阻塞你的机器。要避免这个可以设置自己的DNS服务器,有着本地缓存,是OpenDNS or Verizon.这样大型DNS的上游。。

Reduce log level

在进行广泛抓取是你会对抓取的速率和发现的任何错误感兴趣。这些统计资料在使用INFO日志等级时通过scrapy报告。为了节省CPU(和日志存储需求)你要使用DEBUG日志水平。使用DEBUG在开发广泛抓取器时可能更好。

To set the log level use:

LOG_LEVEL = 'INFO'

Disable cookies

禁用cookies除非你真的需要。cookies在执行广泛抓取时通常用不上的(搜索引擎搜寻器会忽略),他他们还会节省CPU周期减少scrapy抓取器占用的内存来提高性能。

To disable cookies use:

COOKIES_ENABLED = False

Disable retries

重试错误的HTTP请求会实质性的降低抓取的速度,特别是一个网址响应的特变慢(或失败),因此在重试很多次后造成超时错误,这是不必要的,禁用重试就是了。

To disable retries use:

RETRY_ENABLED = False

Reduce download timeout

如果你抓取了一个很慢的连接(不应该出现在广泛抓取中),你可以减少下载器超时,这样卡住的请求就可以很快丢弃,然后释放容量进行下一个抓取。

To reduce the download timeout use:

DOWNLOAD_TIMEOUT = 15

Disable redirects

除非你对跟进的连接感兴趣,否则考虑禁用重定向吧。再进行广泛抓取时,通常保留重定向并在之后的抓取中重新访问这个网站来解决。这有助于每个抓取批次保持包含请求的数量,否则重定向循环会导致抓取器在任何特定的域名上分配过多的资源。

To disable redirects use:

REDIRECT_ENABLED = False

Enable crawling of “Ajax Crawlable Pages”

某些页面(2013年的数据,高达1%)声明他们是可抓取的Ajax( ajax crawlable),这意味着他们提供了纯净HTML版本的内容,这通常只可以通过Ajax获得。页面通过两种方式指示:

  1. by using #! in URL - this is the default way;
  2. 使用特别的元标记,在网站页面的 main index中使用。

Scrapy handles (1) automatically; to handle (2) enable AjaxCrawlMiddleware:

AJAXCRAWL_ENABLED = True

在进行广泛抓取时,通常会抓到很多index网络页面;AjaxCrawlMiddleware 帮助正确的抓取他们。默认时关闭的,因为会造成一些性能开销,而且启用这个对集中抓取没有很大意义。。。

Crawl in BFO order

Scrapy crawls in DFO order by default.

在广泛抓取中,页面抓取往往比页面处理要块,因此未处理的较早的请求会保留在内存中直到达到最后的深度,这会大大增加内存的使用。

Crawl in BFO order 使用BFO顺序抓取会节省内存。

Be mindful of memory leaks

如果你的广泛抓取显示使用内存过高,处理BFO顺序和降低并发你还应该调试你的内存泄漏debug your memory leaks.。

Install a specific Twisted reactor

如果抓取超过了系统的功能,你可能需要尝试下载特别的Twisted reactor,通过TWISTED_REACTOR setting。