我怎样才能 __scrape__ 使用 javascript 扩展内容的页面中的所有信息
How can I __scrape__ all the information from a page that uses javascript to expand the content
我正在尝试 抓取 一个页面,该页面有一个元素列表,底部有一个用于增加列表的展开按钮。它使用 onclick 事件展开,我不知道如何激活它。我正在尝试使用 scrapy-splash,因为我读到它可能有用,但我无法使其正常运行。
我目前正在尝试做的是这样的事情
def expand_page(self, response):
expand = response.css('#maisVagas')
page = response.request.url
if len(expand) > 0:
expand = expand.xpath("@onclick").extract()
yield SplashRequest(url=page, callback=self.expand_page, endpoint='execute',
args={'js_source': expand[0], "wait": 0.5})
else:
yield response.follow(page, self.open_page)
即使它是葡萄牙语,如果它有助于作为参考,我正在尝试抓取的网站是:https://www.vagas.com.br/vagas-em-rio-de-janeiro。展开按钮是页面底部的蓝色按钮,它的检查显示了这个结果。
<a data-grupo="todasVagas" data-filtro="pagina" data-total="16" data-url="/vagas-em-rio-de-janeiro?c%5B%5D=Rio+de+Janeiro&pagina=2" class="btMaisVagas btn" id="maisVagas" onclick="ga('send', 'event', 'Pesquisa', 'anuncios');" href="#" style="pointer-events: all; cursor: pointer;">mostrar mais vagas</a>
没有必要用Splash,看一下chromedevtools的网络工具。它正在使用一些参数发出 get HTTP 请求。这称为 re-engineering HTTP 请求,比使用 splash/selenium 更可取。特别是如果你正在抓取大量数据。
在 re-engineering 的情况下,请求复制 BASH 请求并将其放入 curl.trillworks.com。这为该特定请求提供了格式良好的 headers、参数和 cookie。我通常使用 requests python 包来处理这个 HTTP 请求。在这种情况下,最简单的 HTTP 请求是您只需传递参数而不是 headers.
如果您在右侧查看,您会看到 headers 和参数。使用 reuqests 包我发现你只需要传递页面参数来获取你需要的信息。
params = (
('c[]', 'Rio de Janeiro'),
('pagina', '2'),
('_', '1596444852311'),
)
您可以更改页码以获得接下来的 40 项内容。您还知道此页面上有 590 个项目。
这是第二页。
作为 Scrapy 中的一个最小示例
代码示例
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['vagas.com.br']
data = {
'c[]': 'Rio de Janeiro',
'pagina': '2',
'_':'1596444852311'}
def start_requests(self):
url = 'https://www.vagas.com.br/vagas-em-rio-de-janeiro'
yield scrapy.Request(url=url,callback=self.parse,meta={'data':self.data})
def parse(self, response):
card = response.xpath('//li[@class="vaga even "]')
print(card)
解释
使用start_requests
构建第一个URL,我们使用meta参数并传递一个名为data的字典,并将我们的参数值传递给HTTP请求。当您单击该按钮时,它会抓取页面接下来 40 项的 HTML。
我正在尝试 抓取 一个页面,该页面有一个元素列表,底部有一个用于增加列表的展开按钮。它使用 onclick 事件展开,我不知道如何激活它。我正在尝试使用 scrapy-splash,因为我读到它可能有用,但我无法使其正常运行。
我目前正在尝试做的是这样的事情
def expand_page(self, response):
expand = response.css('#maisVagas')
page = response.request.url
if len(expand) > 0:
expand = expand.xpath("@onclick").extract()
yield SplashRequest(url=page, callback=self.expand_page, endpoint='execute',
args={'js_source': expand[0], "wait": 0.5})
else:
yield response.follow(page, self.open_page)
即使它是葡萄牙语,如果它有助于作为参考,我正在尝试抓取的网站是:https://www.vagas.com.br/vagas-em-rio-de-janeiro。展开按钮是页面底部的蓝色按钮,它的检查显示了这个结果。
<a data-grupo="todasVagas" data-filtro="pagina" data-total="16" data-url="/vagas-em-rio-de-janeiro?c%5B%5D=Rio+de+Janeiro&pagina=2" class="btMaisVagas btn" id="maisVagas" onclick="ga('send', 'event', 'Pesquisa', 'anuncios');" href="#" style="pointer-events: all; cursor: pointer;">mostrar mais vagas</a>
没有必要用Splash,看一下chromedevtools的网络工具。它正在使用一些参数发出 get HTTP 请求。这称为 re-engineering HTTP 请求,比使用 splash/selenium 更可取。特别是如果你正在抓取大量数据。
在 re-engineering 的情况下,请求复制 BASH 请求并将其放入 curl.trillworks.com。这为该特定请求提供了格式良好的 headers、参数和 cookie。我通常使用 requests python 包来处理这个 HTTP 请求。在这种情况下,最简单的 HTTP 请求是您只需传递参数而不是 headers.
如果您在右侧查看,您会看到 headers 和参数。使用 reuqests 包我发现你只需要传递页面参数来获取你需要的信息。
params = (
('c[]', 'Rio de Janeiro'),
('pagina', '2'),
('_', '1596444852311'),
)
您可以更改页码以获得接下来的 40 项内容。您还知道此页面上有 590 个项目。
这是第二页。
作为 Scrapy 中的一个最小示例
代码示例
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['vagas.com.br']
data = {
'c[]': 'Rio de Janeiro',
'pagina': '2',
'_':'1596444852311'}
def start_requests(self):
url = 'https://www.vagas.com.br/vagas-em-rio-de-janeiro'
yield scrapy.Request(url=url,callback=self.parse,meta={'data':self.data})
def parse(self, response):
card = response.xpath('//li[@class="vaga even "]')
print(card)
解释
使用start_requests
构建第一个URL,我们使用meta参数并传递一个名为data的字典,并将我们的参数值传递给HTTP请求。当您单击该按钮时,它会抓取页面接下来 40 项的 HTML。