Scrapy,javascript表单,不爬行下一页

时间:2014-02-19 20:14:11

标签: scrapy

我遇到了问题。我正在使用scrapy从表格搜索后显示的HTML表格中提取数据。问题是它不会继续爬到下一页。我尝试了多种规则组合。我知道不建议覆盖CrawlSpider中的默认解析逻辑。我找到了许多解决其他问题的答案但是,我找不到首先必须进行表单POST的解决方案。我查看我的代码,看到它请求allowed_urls然后POST到search.do,结果将在HTML格式的结果页面中返回,从而开始解析。这是我的代码,我用nourl.com替换了真实的网址

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.http import FormRequest, Request
from EMD.items import EmdItem

class EmdSpider(CrawlSpider):
    name = "emd"
    start_urls = ["https://nourl.com/methor"]
    rules = (
        Rule(SgmlLinkExtractor(restrict_xpaths=('//div//div//div//span[@class="pagelinks"]/a[@href]'))),
        Rule(SgmlLinkExtractor(allow=('')), callback = 'parse_item')
    )

    def parse_item(self, response):
        url = "https://nourl.com/methor-app/search.do"
        payload = {"county": "ANDERSON"}
        return (FormRequest(url, formdata = payload, callback = self.parse_data))

    def parse_data(self, response):
        print response
        sel = Selector(response)
        items = sel.xpath('//td').extract()
        print items

我已将allow = ('')留空,因为我尝试了很多组合。同样在我的xpath中导致这个:

<div align="center">

<div id="bg">
    <!--

     Main Container 

    -->
    <div id="header2"></div>
    <!--

     Content 

    -->
    <div id="content">
        <!--

         Hidden/Accessible Headers 

        -->
        <h1 class="hide"></h1>
        <!--

         InstanceBeginEditable name="Content" 

        -->
        <h2></h2>
        <p align="left"></p>
        <p id="printnow" align="center"></p>
        <p align="left"></p>
        <span class="pagebanner"></span>
        <span class="pagelinks">

            [First/Prev] 

            <strong></strong>

            , 

            <a title="Go to page 2" href="/methor-app/results.jsp?d-49653-p=2"></a>

            , 

            <a title="Go to page 3" href="/methor-app/results.jsp?d-49653-p=3"></a>

             [

            <a href="/methor-app/results.jsp?d-49653-p=2"></a>

            /

            <a href="/methor-app/results.jsp?d-49653-p=7"></a>

            ]

        </span>

我已经检查过多个工具,我的xpath正确指向要转到下一页的URL。我在命令提示符中的输出只是从第一页抓取数据。我已经看过几个教程,其中代码包含一个yield语句,但我不确定除了“告诉函数它将在以后再次使用而不丢失其数据”之外的其他功能“任何想法都会有所帮助。谢谢!!!

1 个答案:

答案 0 :(得分:1)

可能是因为您需要在规则中选择实际的URL,而不仅仅是<a>节点。 XPath中的[...]用于创建条件,而不是选择某些条件。尝试:

//span[@class="pagelinks"]/a/@href

还有一些评论:

  • 您是如何找到此HTML的?谨防找到XPath的工具,因为使用浏览器和scrapy检索的HTML可能不同,因为scrapy不处理Javascript(可用于生成您正在查看的页面,以及一些浏览器尝试清理HTML)。

    这可能不是这种情况,但scrapy问题中的“javascript形式”吓坏了我。您应该始终检查response.body的内容是否符合预期。

  • //div//div//div //div完全相同。两个斜杠意味着我们不再关心结构,只需在当前节点的子节点中选择所有名为div 的节点。这也是为什么//span[...]可以解决问题的原因。