There as several similar questions that I have already read on Stack Overflow. Unfortunately, I lost links of all of them, because my browsing history got deleted unexpectedly.
All of the above questions, couldn't help me. Either, some of them have used CELERY or some of them SCRAPYD, and I want to use the MULTIPROCESSISNG Library. Also, the Scrapy Official Documentation shows how to run multiple spiders on a SINGLE PROCESS, not on MULTIPLE PROCESSES.
None of them couldn't help …
python scrapy web-scraping scrapy-spider python-multiprocessing
我在启动同一个蜘蛛的多个实例时遇到困难.我想像1个url for 1 spider实例一样运行它.我必须处理50k网址,为此我需要为每个网址启动单独的实例.在我的主蜘蛛脚本中,我设置了closepider timeut 7分钟,以确保我不会长时间爬行.请参阅以下代码:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
import urlparse
for start_url in all_urls:
domain = urlparse.urlparse(start_url).netloc
if domain.startswith('ww'):
domain = domain.split(".",1)[1]
process = CrawlerProcess(get_project_settings())
process.crawl('textextractor', start_url=start_url,allowed_domains=domain)
process.start()
Run Code Online (Sandbox Code Playgroud)
它完全运行第一个url,bur之后第二个url通过时它给出了以下错误:
raise error.ReactorNotRestartable()
ReactorNotRestartable
Run Code Online (Sandbox Code Playgroud)
请建议我该怎么做才能让它运行同一个蜘蛛的多个实例.此外,我正在考虑使用线程一次启动多个scrapy实例.这是一个很好的方法吗?
试图阅读Scrapy的代码.scaper,crawler和spider这两个词令人困惑.例如
scrapy.core.scraper
scrapy.crawler
scrapy.spiders
Run Code Online (Sandbox Code Playgroud)
任何人都可以在Scrapy的背景下解释这些术语的含义和差异吗?提前致谢.
好了,我的初始代码可以正常工作,但是错过了网站上一些奇怪的格式:
response.xpath("//*[contains(., 'Description:')]/following-sibling::p/text()").extract()
<div id="body">
<a name="main_content" id="main_content"></a>
<!-- InstanceBeginEditable name="main_content" -->
<div class="return_to_div"><a href="../../index.html">HOME</a> | <a href="../index.html">DEATH ROW</a> | <a href="index.html">INFORMATION</a> | text</div>
<h1>text</h1>
<h2>text</h2>
<p class="text_bold">text:</p>
<p>text</p>
<p class="text_bold">text:</p>
<p>text</p>
<p class="text_bold">Description:</p>
<p>Line1</p>
<p>Line2</p>
Line3 <!-- InstanceEndEditable -->
</div>
Run Code Online (Sandbox Code Playgroud)
我没有问题拉第1行和第2行。但是第3行不是我的P类的兄弟。这仅在我尝试从表中抓取的某些页面上发生。
这是链接:https : //www.tdcj.state.tx.us/death_row/dr_info/wardadamlast.html
抱歉,Xpath令我感到困惑,是否有一种方法可以提取符合条件的所有数据,//*[contains(., 'Description:')]而不必成为同级?
提前致谢。
编辑:更改了示例以更加反映实际情况。添加到原始页面的链接。
我正在使用脚本文件在scrapy项目中运行Spider,Spider正在记录搜寻器的输出/结果。但是我想在某些功能的脚本文件中使用蜘蛛输出/结果。我不想将输出/结果保存在任何文件或数据库中。这是从https://doc.scrapy.org/en/latest/topics/practices.html#run-from-script获得的脚本代码
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings
configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
runner = CrawlerRunner(get_project_settings())
d = runner.crawl('my_spider')
d.addBoth(lambda _: reactor.stop())
reactor.run()
def spider_output(output):
# do something to that output
Run Code Online (Sandbox Code Playgroud)
我如何在“ spider_output”方法中获得蜘蛛输出。有可能获得输出/结果。
我在python中编写了一个脚本,Scrapy用于通过代理向网页发送请求而不更改settings.py或中的任何内容DOWNLOADER_MIDDLEWARES.它现在很好用.但是,我唯一不能使用的是创建一个代理列表,这样如果一个失败,另一个将被使用.我如何抽取这一部分os.environ["http_proxy"] = "http://176.58.125.65:80"逐一获取代理列表,因为它只支持一个代理.任何有关这方面的帮助将受到高度赞赏.
这是我到目前为止尝试过的(工作一个):
import scrapy, os
from scrapy.crawler import CrawlerProcess
class ProxyCheckerSpider(scrapy.Spider):
name = 'lagado'
start_urls = ['http://www.lagado.com/proxy-test']
os.environ["http_proxy"] = "http://176.58.125.65:80" #can't modify this portion to get list of proxies
def parse(self, response):
stat = response.css(".main-panel p::text").extract()[1:3]
yield {"Proxy-Status":stat}
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
})
c.crawl(ProxyCheckerSpider)
c.start()
Run Code Online (Sandbox Code Playgroud)
我不想更改任何内容settings.py或创建任何自定义middleware以达到目的.我希望通过单个代理实现与上面相同的(外部).谢谢.
我有一个元组列表(id,url)我需要从URL列表中抓取产品,当这些产品被抓取时,我需要将它们存储在他们的id下的数据库中.
问题是我无法理解如何将id传递给解析函数,以便我可以将已爬行的项目存储在其id下.
有一个我正在抓取的网站,有时会返回200,但在response.body中没有任何文本(当我尝试用Selector解析时引发一个AttributeError).
是否有一种简单的方法来检查以确保正文包含文本,如果没有,请重试请求,直到它为止?这是一些伪代码来概述我正在尝试做什么.
def check_response(response):
if response.body != '':
return response
else:
return Request(copy_of_response.request,
callback=check_response)
Run Code Online (Sandbox Code Playgroud)
基本上,有没有办法可以使用完全相同的属性(方法,URL,有效负载,cookie等)重复请求?
我想用2个部分抓取一个网站,我的脚本没有我需要的那么快.
是否可以发射2个蜘蛛,一个用于刮第一部分,第二个用于第二部分?
我试着有两个不同的类,然后运行它们
scrapy crawl firstSpider
scrapy crawl secondSpider
Run Code Online (Sandbox Code Playgroud)
但我认为这不聪明.
我在python的scrapy中编写了一个脚本,通过get_proxies()方法使用新生成的代理之一来生成代理请求.我使用requests模块来获取代理,以便在脚本中重用它们.但是,问题是我的脚本选择使用的代理可能不是一个好的代理,所以有时它不会获取有效的响应.
在有有效响应之前,如何让我的脚本继续尝试不同的代理?
我的脚本到目前为止:
import scrapy
import random
import requests
from itertools import cycle
from bs4 import BeautifulSoup
from scrapy.http.request import Request
from scrapy.crawler import CrawlerProcess
class ProxySpider(scrapy.Spider):
name = "sslproxies"
check_url = "https://stackoverflow.com/questions/tagged/web-scraping"
proxy_link = "https://www.sslproxies.org/"
def start_requests(self):
proxylist = self.get_proxies()
random.shuffle(proxylist)
proxy_ip_port = next(cycle(proxylist))
print(proxy_ip_port) #Checking out the proxy address
request = scrapy.Request(self.check_url, callback=self.parse,errback=self.errback_httpbin,dont_filter=True)
request.meta['proxy'] = "http://{}".format(proxy_ip_port)
yield request
def get_proxies(self):
response = requests.get(self.proxy_link)
soup = BeautifulSoup(response.text,"lxml")
proxy = [':'.join([item.select_one("td").text,item.select_one("td:nth-of-type(2)").text]) for item in soup.select("table.table tbody …Run Code Online (Sandbox Code Playgroud) scrapy ×10
scrapy-spider ×10
python ×9
web-scraping ×8
web-crawler ×3
proxy ×1
python-2.7 ×1
python-3.x ×1
twisted ×1
xpath ×1