我正在编写scrapy爬虫来从电子商务网站上抓取数据。该网站有颜色变体,每个变体都有自己的价格、尺寸和该尺寸的库存。要获取变体的价格、尺寸和库存,需要访问变体(颜色)的链接。所有数据都需要在一份记录中。我尝试过使用请求,但速度很慢,有时无法加载页面。
requests.get()我已经使用和解析数据中的响应编写了爬虫scrapy.selector.Selector()。
我的问题是,有什么方法可以使用 scrapy.Request() 来获取响应,而不是在回调函数中使用它。我需要在下面相同的地方得到回复(如下所示),
response = scrapy.Request(url=variantUrl)
sizes = response.xpath('sizesXpath').extract()
Run Code Online (Sandbox Code Playgroud)
我知道scrapy.Request()require 参数被调用callback=self.callbackparsefunction
,当 scrapy 生成响应来处理生成的响应时,将会调用该参数。我不想使用回调函数,我想在当前函数中处理响应。
或者有什么方法可以将回调函数的响应返回到scrapy.Request()如下所示的函数(如下所示),
def parse(self, response):
variants = response.xpath('variantXpath').extract()
for variant in variants:
res = scrapy.Request(url=variant,callback=self.parse_color)
# use of the res response
def parse_color(self, response):
return response
Run Code Online (Sandbox Code Playgroud) 我正在nuxt3应用程序中测试 pinia 商店。
在商店内部setup(),我用来useRuntimeConfig从公共配置变量中获取计数器的初始值,但出现此错误,ReferenceError: useRuntimeConfig is not defined不知道如何解决
// store/counter.ts
...
state: () => {
const runtimeConfig = useRuntimeConfig()
const count = runtimeConfig.public.count
return {
...
count
...
}
},
...
Run Code Online (Sandbox Code Playgroud)
代码
// store/counter.test.ts
import { fileURLToPath } from 'node:url'
import { describe, expect, it, beforeEach } from 'vitest'
import { setActivePinia, createPinia } from 'pinia'
import { useCounter } from './counter'
import { setup } from '@nuxt/test-utils'
await setup({
rootDir: fileURLToPath(new …Run Code Online (Sandbox Code Playgroud) 我有一个简单的脚本,可以从亚马逊抓取数据,大家都知道有一个验证码,所以当验证码到达时页面标题是``机器人检查'',因此如果页面title = 'Robot check'和打印消息的页面不被抓取,则我为这种情况写了逻辑,有验证码在该页面上”,并且不会从该页面获取数据。否则继续执行脚本。
但是在if部分中,我尝试yield scrapy.Request(response.url, callback=self.parse)重新请求当前URL,但没有成功。我只需要做的就是重新请求response.url并继续执行脚本,因为这是我想我要做的是response.url从日志文件中删除该脚本,所以scrapy记不清URL的抓取方式,我必须愚弄scrapy并再次请求相同网址,或者是否有办法将其标记response.url为失败的网址,因此系统会自动重新请求。
这是简单的脚本,start_urls位于同一文件夹中名为urls的单独文件中,因此我已从urls文件中导入了它
import scrapy
import re
from urls import start_urls
class AmazondataSpider(scrapy.Spider):
name = 'amazondata'
allowed_domains = ['https://www.amazon.co.uk']
def start_requests(self):
for x in start_urls:
yield scrapy.Request(x, self.parse)
def parse(self, response):
try:
if 'Robot Check' == str(response.xpath('//title/text()').extract_first().encode('utf-8')):
print '\n\n\n The ROBOT CHeCK Page This link is reopening......\n\n\n'
print 'URL : ',response.url,'\n\n'
yield scrapy.Request(response.url, callback=self.parse)
else:
print '\n\nThere is a data in this page …Run Code Online (Sandbox Code Playgroud) 我有用 python 3.6 编写的 scrapy 项目。该项目有 3 个爬虫,它只需从 3 个不同的网站抓取项目,每个网站一个爬虫。items.py我正在使用脚本中的项目yield item,每个爬虫在项目中都有细微的不同,我运行它scrapy crawl crawlera -o sample.json并获取sample.json文件作为输出文件。我对每个爬虫执行相同的操作,但输出文件名不同。
但是,我想做的是,我想timestamp + website name为每个网站提供文件名,这样每次运行和每个网站的文件名都会不同。
所有三个爬虫都有相同的结构,如下所示
# -*- coding: utf-8 -*-
import scrapy
import logging
from time import sleep
from selenium import webdriver
from scrapy.selector import Selector
from scrapy.utils.log import configure_logging
from product_data_scraper.items import TakealotItem
from product_data_scraper.spiders.helper import Helper
class TakealotSpider(scrapy.Spider):
name = 'takealot'
allowed_domains = ['www.takealot.com']
takealothelper = Helper.TakealotHelper
driver_path = './chromedriver'
configure_logging(install_root_handler=False)
logging.basicConfig(
filename='logs/log_takealot.txt', …Run Code Online (Sandbox Code Playgroud) 我正在创建一个脚本,用于爬网一个网站以收集一些数据,但是问题是,在请求过多后,它们阻止了我,但是使用代理,我可以发送的请求要多于当前的请求。我已经将代理与chrome选项集成在一起--proxy-server
options.add_argument('--proxy-server={}'.format('http://ip:port'))
但是我使用的是付费代理,因此需要身份验证,如下面的屏幕截图所示,它提供了用户名和密码的警告框
options.add_argument('--proxy-server={}'.format('http://username:password@ip:port'))
但这似乎也不起作用。我在寻找解决方案,并在下面找到解决方案,并与chrome扩展代理自动身份验证一起使用,而没有chrome扩展
proxy = {'address': settings.PROXY,
'username': settings.PROXY_USER,
'password': settings.PROXY_PASSWORD}
capabilities = dict(DesiredCapabilities.CHROME)
capabilities['proxy'] = {'proxyType': 'MANUAL',
'httpProxy': proxy['address'],
'ftpProxy': proxy['address'],
'sslProxy': proxy['address'],
'noProxy': '',
'class': "org.openqa.selenium.Proxy",
'autodetect': False,
'socksUsername': proxy['username'],
'socksPassword': proxy['password']}
options.add_extension(os.path.join(settings.DIR, "extension_2_0.crx")) # proxy auth extension
Run Code Online (Sandbox Code Playgroud)
但以上两种方法均不能正常工作,因为似乎在上述代码之后,代理身份验证警报消失了,并且当我通过谷歌搜索我的IP并确认其无效时检查了我的IP时。
请任何可以帮助我在chromedriver上认证代理服务器的人。