【问题标题】:Scrapy: next button uses javascriptScrapy:下一个按钮使用 javascript
【发布时间】:2013-09-19 14:09:03
【问题描述】:

我正在尝试从这个网站上抓取http://saintbarnabas.hodesiq.com/joblist.asp?user_id= 我想获取所有的 RN... 我可以抓取数据但无法继续到下一页 因为它的javascript。我尝试阅读其他问题,但我不明白。这是我的代码

class MySpider(CrawlSpider):
    name = "commu"
    allowed_domains = ["saintbarnabas.hodesiq.com"]
    start_urls = ["http://saintbarnabas.hodesiq.com/joblist.asp?user_id=",
    ]
    rules = (Rule (SgmlLinkExtractor(allow=('\d+'),restrict_xpaths=('*'))
    , callback="parse_items", follow= True),
    )

下一个按钮显示为

<a href="Javascript: Move('next')">Next</a>

这个分页让我死了......

【问题讨论】:

  • 如果你需要抓取 JavaScript 或 AJAX 内容,你可以通过 Selenium WebDriver 和 Firefox 来阅读它,它会打开一个成熟的浏览器来阅读页面。
  • 怎么样?你能给我一个想法,以便它可以指向另一个页面...

标签: python selenium-webdriver web-scraping scrapy


【解决方案1】:

简而言之,您需要弄清楚 Move('next') 做了什么并在您的代码中重现它。

快速浏览网站显示功能代码是这样的:

function Move(strIndicator)
{
    document.frm.move_indicator.value = strIndicator;
    document.frm.submit();
}

document.frm 是名称为“frm”的表单:

<form name="frm" action="joblist.asp" method="post">

因此,基本上您需要构建一个请求来执行该表单的POST,并将move_indicator 值设置为'next'。这可以通过使用 FormRequest 类 (see the docs) 轻松完成,例如:

return FormRequest.from_response(response, formname="frm", 
                                 formdata={'move_indicator': 'next'})

这种技术在大多数情况下都有效。困难的部分是弄清楚 javascript 代码是做什么的,有时它可能会被混淆并执行过于复杂的东西以避免被抓取。

【讨论】:

  • 我已经使用您在 c9.io/redapple/so_18810850 的回答编写了 BaseSpider。欢迎您修改。
  • 那么我应该在哪里插入 something.select.something.extract()?
  • @chano 该链接只是触发表单中的帖子。 FormRequest 解析页面中的表单,自动加载表单的字段,并构造一个请求对象。您不需要为此请求 .extract() 任何其他内容。
  • 我确实尝试运行代码,我可以看到它解析。但我想做的是抓取一些数据。
  • 对,在规则提取器中使用模式allow="JobID=\d+" 并删除the restrict_xpaths="*"
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2015-08-12
相关资源
最近更新 更多