标签: scrapinghub

无法使用shub-image运行/部署自定义脚本

我有使用shub-image 运行/部署自定义脚本的问题.

setup.py

from setuptools import setup, find_packages

setup(
    name = 'EU-Crawler',
    version = '1.0',
    packages = find_packages(),
    scripts = [
        'bin/launcher.py',
        'bin/DE_WEB_launcher.py',
        'bin/ES_WEB_launcher.py',
        'bin/FR_WEB_launcher.py',
        'bin/IT_WEB_launcher.py',
        'bin/NL_WEB_launcher.py',
        'bin/DE_MOBILE_launcher.py',
        'bin/FR_MOBILE_launcher.py'
    ],
    package_data = {
        'Crawling': ['*.ini'],
    },
    entry_points = {'scrapy': ['settings = Crawling.settings']},
    install_requires=[
        'scrapy-crawlera>=1.2.2',
        'configobj',
        'scrapy-fake-useragent',
        'xmltodict',
        'selenium==2.53.2',
        'python-dateutil',
        'pyvirtualdisplay',
        'beautifulsoup4',
        'incapsula-cracker-py3'
    ], 
    extras_require={'ScrapyElasticSearch': 'ScrapyElasticSearch[extras]'},
    zip_safe = False,
    include_package_data=True
)
Run Code Online (Sandbox Code Playgroud)

在这个文件中我有

scripts = [
       'bin/launcher.py',
       'bin/DE_WEB_launcher.py',
       'bin/ES_WEB_launcher.py',
       'bin/FR_WEB_launcher.py',
       'bin/IT_WEB_launcher.py',
       'bin/NL_WEB_launcher.py',
       'bin/DE_MOBILE_launcher.py',
       'bin/FR_MOBILE_launcher.py'
   ],
Run Code Online (Sandbox Code Playgroud)

谁是我要发送的不同的filse

我使用此命令进行部署

sudo shub image …
Run Code Online (Sandbox Code Playgroud)

python scrapy scrapinghub

11
推荐指数
1
解决办法
238
查看次数

具有状态会话的 Scrapy 并发请求

我已经有一段时间进行网络抓取,但对 python 来说相对较新,最近将我所有的抓取活动从 ruby​​ 切换到 python,主要是因为scrapy和scrapinghub似乎为大规模生产化抓取提供了更好的支持。

我在抓取电子商务网站时遇到的一个问题是,许多似乎使用“有状态”会话,即除非您发送从先前响应返回的相同 cookie,否则下一个请求可能会被阻止。特别是,许多使用IBM Websphere 的站点都表现出这种行为。

鉴于使用并发异步请求,这成为scrapy 的一个问题。

这些站点中的大多数都需要加载 JS 才能设置初始 cookie,因此我的方法是使用 Selenium(无头 chromedriver)加载初始页面,然后将 cookie 传递给普通的 scrapy 请求。

def __initialise_cookies(self):
        # Where self is the spider and driver is the Selenium driver instance
        self.session_cookies = self.driver.get_cookies()
Run Code Online (Sandbox Code Playgroud)

当 CONCURRENT_REQUESTS 在 scrapy 配置文件中设置为 1 时,这种方法完全正常。然而,这消除了所有并发性,显然会大大减慢刮擦速度。

我知道scrapy 已经发布了下载器中间件功能,允许在请求中命名cookiejar,然后传递给后续请求。我也读过这篇文章。然而,这似乎并没有解决我的问题 - 我只能假设是因为并发导致 cookiejar 被同时重复使用多次,即使您创建几个不同的 cookiejar 作为起点。

有没有人有关于如何解决这个问题的想法?

理想情况下,我想创建与 CONCURRENT_REQUESTS 设置(例如 16)相同数量的会话 cookiejar,但是我如何处理确保每个 cookiejar 一次最多只使用一次,然后将响应 cookie 传递给下一个请求。

我知道 Twisted 不使用线程,但是为 N 个 cookiejar 中的每一个创建一个信号量并使请求等待直到它未使用后再发送下一个请求是否有意义?

python session-cookies scrapy web-scraping scrapinghub

6
推荐指数
0
解决办法
796
查看次数

Scrapy 隐藏的内存泄漏

背景- TLDR:我的项目中有内存泄漏

花了几天时间用scrapy查看内存泄漏文档,但找不到问题。我正在开发一个中等规模的scrapy 项目,每天大约有 4 万个请求。

我使用scrapinghub的预定运行来主持这个。

scrapinghub 上,每月 9 美元,您基本上可以获得 1 个具有 1GB RAM 的 VM 来运行您的爬虫。

我在本地开发了一个爬虫并上传到scrapinghub,唯一的问题是在运行结束时,我超出了内存。

本地化设置CONCURRENT_REQUESTS=16工作正常,但导致超过 50% 点的scrapinghub内存。当我设置 时CONCURRENT_REQUESTS=4,我在 95% 点超过了内存,因此减少到 2 应该可以解决问题,但是我的爬虫变得太慢了。

另一种解决方案是为 2 个 VM 付费以增加 RAM,但我有一种感觉,我设置爬网程序的方式会导致内存泄漏。

对于此示例,该项目将抓取在线零售商。在本地运行时,我的memusage/max是 2.7gb 和CONCURRENT_REQUESTS=16.

我现在将运行我的scrapy结构

  1. 获取要抓取的总页数
  2. 使用以下命令遍历所有这些页面:www.example.com/page={page_num}
  3. 在每个页面上,收集有关 48 种产品的信息
  4. 对于这些产品中的每一个,请转到他们的页面并获取一些信息
  5. 使用该信息,为每个产品直接调用 API
  6. 使用项目管道保存这些(我在本地写入 csv,但不在 scrapinghub 上)
  • 管道
    class Pipeline(object):
        def process_item(self, item, spider):
            item['stock_jsons'] = json.loads(item['stock_jsons'])['subProducts']
            return item
Run Code Online (Sandbox Code Playgroud)
  • 项目
    class mainItem(scrapy.Item):
        date = scrapy.Field()
        url …
Run Code Online (Sandbox Code Playgroud)

python memory scrapy scrapinghub

6
推荐指数
1
解决办法
477
查看次数

scrapy使用CrawlerProcess.crawl()从脚本将custom_settings传递给spider

我试图通过脚本以编程方式调用蜘蛛.我无法使用CrawlerProcess通过构造函数覆盖设置.让我用默认的蜘蛛来说明这一点,用于从官方scrapy站点抓取引号(官方scrapy引用示例蜘蛛的最后一个代码片段).

class QuotesSpider(Spider):

    name = "quotes"

    def __init__(self, somestring, *args, **kwargs):
        super(QuotesSpider, self).__init__(*args, **kwargs)
        self.somestring = somestring
        self.custom_settings = kwargs


    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield Request(url=url, callback=self.parse)

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('small.author::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }
Run Code Online (Sandbox Code Playgroud)

这是我尝试运行引号蜘蛛的脚本

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.settings import Settings

    def main():

    proc = CrawlerProcess(get_project_settings())

    custom_settings_spider = \
    {
        'FEED_URI': 'quotes.csv',
        'LOG_FILE': 'quotes.log' …
Run Code Online (Sandbox Code Playgroud)

scrapy web-scraping python-3.x scrapinghub scrapy-spider

5
推荐指数
1
解决办法
2553
查看次数

Pygsheets无法在www.googleapis.com上找到服务器

我正在尝试pygsheets在ScrapingHub的脚本中使用。pygsheets脚本的一部分开始于:

google_client = pygsheets.authorize(service_file=CREDENTIALS_FILENAME, no_cache=True)
spreadsheet = google_client.open_by_key(SHEET_ID)
Run Code Online (Sandbox Code Playgroud)

CREDENTIALS_FILENAME我的Google服务帐户凭据文件名在哪里SHEET_ID,电子表格ID 在哪里?在某些时候,这正在发生:

2018-01-30 16:27:36 INFO [stdout] service_email : *******@**********.iam.gserviceaccount.com
2018-01-30 16:27:36 INFO [googleapiclient.discovery] URL being requested: GET https://www.googleapis.com/drive/v3/files?corpora=user&pageSize=500&fields=files%28id%2C+name%29&q=mimeType%3D%27application%2Fvnd.google-apps.spreadsheet%27&supportsTeamDrives=false&includeTeamDriveItems=false&alt=json
2018-01-30 16:27:36 INFO [oauth2client.transport] Attempting refresh to obtain initial access_token
2018-01-30 16:27:36 INFO [oauth2client.client] Refreshing access_token
2018-01-30 16:31:50 ERROR [root] Job runtime exception
Traceback (most recent call last):
  File "/app/python/lib/python3.6/site-packages/httplib2/__init__.py", line 995, in _conn_request
    conn.connect()
  File "/usr/local/lib/python3.6/http/client.py", line 1392, in connect
    super().connect()
  File "/usr/local/lib/python3.6/http/client.py", line 936, in …
Run Code Online (Sandbox Code Playgroud)

python google-sheets scrapinghub google-sheets-api pygsheets

5
推荐指数
0
解决办法
677
查看次数

Scrapy does not fetch markup on response.css

I've built a simple scrapy spider running on scrapinghub:

class ExtractionSpider(scrapy.Spider):
    name = "extraction"
    allowed_domains = ['domain']
    start_urls = ['http://somedomainstart']
    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"

    def parse(self, response):
        urls = response.css('a.offer-details__title-link::attr(href)').extract()

        print(urls)
        for url in urls:
            url = response.urljoin(url)
            yield SplashRequest(url=url, callback=self.parse_details)

        multiple_locs_urls = response.css('a.offer-regions__label::attr(href)').extract()
        print(multiple_locs_urls)        
        for url in multiple_locs_urls:
            url = response.urljoin(url)
            yield SplashRequest(url=url, callback=self.parse_details)

        next_page_url = response.css('li.pagination_element--next > a.pagination_trigger::attr(href)').extract_first()
        if next_page_url:
            next_page_url = response.urljoin(next_page_url)
            yield SplashRequest(url=next_page_url, callback=self.parse)

    def parse_details(self, …
Run Code Online (Sandbox Code Playgroud)

python scrapy web-scraping scrapinghub splash-js-render

5
推荐指数
1
解决办法
202
查看次数

scrapy如何从scrapinghub的文件加载url

我知道如何在本地工作时从外部源将数据加载到 Scrapy 蜘蛛中。但是我很难找到有关如何将此文件部署到 scrapinghub 以及在那里使用什么路径的任何信息。现在我使用 SH 文档中的这种方法 -在此处输入链接描述但收到 NONE 对象。

import pkgutil

class CodeSpider(scrapy.Spider):
name = "code"
allowed_domains = ["google.com.au"]

def start_requests(self, ):

    f = pkgutil.get_data("project", "res/final.json")
    a = json.loads(f.read())
Run Code Online (Sandbox Code Playgroud)

谢谢。我的安装文件

from setuptools import setup, find_packages

setup(
    name         = 'project',
    version      = '1.0',
    packages     = find_packages(),
    package_data = {'project': ['res/*.json']
    },
    entry_points = {'scrapy': ['settings = au_go.settings']},

    zip_safe=False,

)
Run Code Online (Sandbox Code Playgroud)

我得到的错误。

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/scrapy/core/engine.py", line 127, in _next_request
    request = next(slot.start_requests)
  File "/tmp/unpacked-eggs/__main__.egg/au_go/spiders/code.py", line 16, …
Run Code Online (Sandbox Code Playgroud)

scrapy scrapinghub

4
推荐指数
1
解决办法
932
查看次数

从 Scrapinghub 下载项目的源代码

我在Scrapinghub 上部署了一个项目,我根本没有该代码的任何副本。

如何从 Scrapinghub 在我的本地主机上下载整个项目的代码?

python scrapy scrapinghub

3
推荐指数
1
解决办法
451
查看次数

从scrapinghub删除蜘蛛

我是scrapinghub的新用户。我已经在谷歌上搜索过并阅读了 scrapinghub 文档,但我找不到任何关于从项目中删除蜘蛛的信息。可能吗,怎么可能?我不想替换蜘蛛,我想从scrapinghub蜘蛛列表中删除/移除它。

web-crawler scrapy scrapinghub scrapy-spider

2
推荐指数
1
解决办法
1304
查看次数

如何将数据传递给scrapinghub?

我正在尝试在scrapinghub 上运行一个scrapy Spider,我想传入一些数据。我正在使用他们的 API 来运行蜘蛛:

http://doc.scrapinghub.com/api/jobs.html#jobs-run-json

他们有一个job_settings似乎相关的选项,但我不知道如何访问job_settingsSpider班级中的数据。这里的正确方法是什么?

python scrapy scrapinghub

2
推荐指数
1
解决办法
239
查看次数