当 javascript 加载时,它会发出另一个 ajax 请求,其中应在响应中设置 cookie。但是,Splash 不会在多个请求中保留任何 cookie,有没有办法在所有请求中保留 cookie?或者甚至在每个请求之间手动分配它们。
我正在尝试使用 Scrapy 登录网站,但收到的响应是仅包含内联 JavaScript 的 HTML 文档。JS 重定向到我想从中抓取数据的页面。但是 Scrapy 不执行 JS,因此不会路由到我想要的页面。
我使用以下代码提交所需的登录表单:
def parse(self, response):
request_id = response.css('input[name="request_id"]::attr(value)').extract_first()
data = {
'userid_placeholder': self.login_user,
'foilautofill': '',
'password': self.login_pass,
'request_id': request_id,
'username': self.login_user[1:]
}
yield scrapy.FormRequest(url='https://www1.up.ac.za/oam/server/auth_cred_submit', formdata=data,
callback=self.print_p)
Run Code Online (Sandbox Code Playgroud)
print_p 回调函数如下:
def print_p(self, response):
print(response.text)
Run Code Online (Sandbox Code Playgroud)
我看过scrapy-splash,但找不到在响应中使用scrapy-splash执行JS的方法。
我正在编写一个scrapy-splash程序,并且需要单击网页上的显示按钮(如下图所示),以便显示第10版的数据,因此可以对其进行抓取。我有下面尝试过的代码,但是没有用。我需要的信息只有在单击显示按钮后才能访问。 更新:仍然为此而苦苦挣扎,我必须相信有一种方法可以做到这一点。我不想刮JSON,因为这可能是网站所有者的一个危险信号。
import scrapy
from ..items import NameItem
class LoginSpider(scrapy.Spider):
name = "LoginSpider"
start_urls = ["http://www.starcitygames.com/buylist/"]
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formcss='#existing_users form',
formdata={'ex_usr_email': 'email123@example.com', 'ex_usr_pass': 'password123'},
callback=self.after_login
)
def after_login(self, response):
item = NameItem()
display_button= response.xpath('//a[contains(., "- Display>>")]/@href').get()
response.follow(display_button, self.parse)
item["Name"] = response.css("div.bl-result-title::text").get()
return item
Run Code Online (Sandbox Code Playgroud)
我使用此链接安装了Splash。按照所有步骤进行安装,但 Splash 不起作用。
我的settings.py文件:
BOT_NAME = 'Teste'
SPIDER_MODULES = ['Test.spiders']
NEWSPIDER_MODULE = 'Test.spiders'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
SPLASH_URL = 'http://127.0.0.1:8050/'
Run Code Online (Sandbox Code Playgroud)
当我运行时scrapy crawl TestSpider
:
[scrapy.core.engine] INFO: Spider opened
[scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
[scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET http://www.google.com.br via http://127.0.0.1:8050/render.html> (failed 1 times): Connection was refused by other side: 111: Connection refused.
[scrapy.downloadermiddlewares.retry] …
Run Code Online (Sandbox Code Playgroud) 我正在尝试伪造用户代理并在 Python 中轮换它们。
我在网上找到了一个关于如何使用scrapy-useragents包使用 Scrapy 执行此操作的教程。
我抓取网页https://www.whatsmyua.info/,以检查我的用户代理,看看它是否与我的不同以及它是否旋转。它与我的实际用户代理不同吗,但它不会轮换,它每次都会返回相同的用户代理,而且我无法弄清楚出了什么问题。
设置.py
BOT_NAME = 'scrapy_javascript'
SPIDER_MODULES = ['scrapy_javascript.spiders']
NEWSPIDER_MODULE = 'scrapy_javascript.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'scrapy_javascript (+http://www.yourdomain.com)'
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# -----------------------------------------------------------------------------
# USER AGENT
# -----------------------------------------------------------------------------
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_useragents.downloadermiddlewares.useragents.UserAgentsMiddleware': 500,
}
USER_AGENTS = [
('Mozilla/5.0 (X11; Linux x86_64) '
'AppleWebKit/537.36 (KHTML, like …
Run Code Online (Sandbox Code Playgroud) 我正在使用Splash v2.3.2 并且我正在尝试呈现一个页面,但它并没有呈现所有内容。它不会渲染图像或动态加载的内容。
我正在使用我的http://localhost:8050/脚本:
function main(splash)
local url = splash.args.url
assert(splash:go(url))
assert(splash:wait(10))
return {
html = splash:html(),
png = splash:png(),
har = splash:har(),
}
end
Run Code Online (Sandbox Code Playgroud)
我试图改变等待时间,也试图允许插件。这些都行不通。我假设动态加载的内容受到限制,但我不确定。任何帮助表示赞赏。
在avito.ru(俄罗斯房地产网站)上,隐藏人的电话,直到您单击它为止。我想使用Scrapy + Splash收集电话。
范例网址:https://www.avito.ru/moskva/kvartiry/2-k_kvartira_84_m_412_et._992361048
单击按钮后,将显示弹出窗口,并且可以看到电话。
我使用带有以下Lua脚本的Splash execute API:
function main(splash)
splash:go(splash.args.url)
splash:wait(10)
splash:runjs("document.getElementsByClassName('item-phone-button')[0].click()")
splash:wait(10)
return splash:png()
end
Run Code Online (Sandbox Code Playgroud)
未单击该按钮,也不显示电话号码。这是一项微不足道的任务,我无法解释为什么它不起作用。
如果将替换item-phone-button
为,则单击可以在同一页面上的其他字段上正常使用js-show-stat
。因此,在一般情况下,Javascript 和蓝色的“显示电话”按钮必须具有某种特殊性。
为了隔离问题,我创建了一个包含最少示例脚本的存储库和用于Splash的docker-compose文件:https : //github.com/alexanderlukanin13/splash-avito-phone
Javascript代码有效,您可以使用Chrome和Firefox中的Javascript控制台进行验证
document.getElementsByClassName('item-phone-button')[0].click()
Run Code Online (Sandbox Code Playgroud)
我已经在Splash 3.0、3.1、3.2版本中尝试过,结果是一样的。
我也尝试过:
@Lore的建议,包括simulateClick()
方法(请参见simulate_click分支)
mouseDown / mouseUp事件,如此处所述:模拟Tampermonkey中的mousedown,click,mouseup序列?(请参见trigger_mouse_event分支)