我有使用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 来说相对较新,最近将我所有的抓取活动从 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 中的每一个创建一个信号量并使请求等待直到它未使用后再发送下一个请求是否有意义?
背景- 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结构
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) 我试图通过脚本以编程方式调用蜘蛛.我无法使用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) 我正在尝试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
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) 我知道如何在本地工作时从外部源将数据加载到 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) 我在Scrapinghub 上部署了一个项目,我根本没有该代码的任何副本。
如何从 Scrapinghub 在我的本地主机上下载整个项目的代码?
我是scrapinghub的新用户。我已经在谷歌上搜索过并阅读了 scrapinghub 文档,但我找不到任何关于从项目中删除蜘蛛的信息。可能吗,怎么可能?我不想替换蜘蛛,我想从scrapinghub蜘蛛列表中删除/移除它。
我正在尝试在scrapinghub 上运行一个scrapy Spider,我想传入一些数据。我正在使用他们的 API 来运行蜘蛛:
http://doc.scrapinghub.com/api/jobs.html#jobs-run-json
他们有一个job_settings似乎相关的选项,但我不知道如何访问job_settings我Spider班级中的数据。这里的正确方法是什么?
scrapinghub ×10
scrapy ×9
python ×7
web-scraping ×3
memory ×1
pygsheets ×1
python-3.x ×1
web-crawler ×1