Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scrapy,javascript表单,不爬网下一页_Scrapy - Fatal编程技术网

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

Scrapy,javascript表单,不爬网下一页,scrapy,Scrapy,我有个问题。我使用scrapy从表单搜索后显示的HTML表中提取数据。问题是它不会继续爬网到下一页。我尝试了多种规则组合。我理解,不建议覆盖CrawlSpider中的默认解析逻辑。我已经找到了许多解决其他问题的答案,但是,我还没有找到一个解决方案,其中必须首先出现一个表单帖子。我查看我的代码,发现它请求允许的\u URL,然后发布到搜索.do,结果在HTML格式的结果页面中返回,因此解析开始。这是我的代码,我用nourl.com替换了真实的url from scrapy.contrib.spid

我有个问题。我使用scrapy从表单搜索后显示的HTML表中提取数据。问题是它不会继续爬网到下一页。我尝试了多种规则组合。我理解,不建议覆盖CrawlSpider中的默认解析逻辑。我已经找到了许多解决其他问题的答案,但是,我还没有找到一个解决方案,其中必须首先出现一个表单帖子。我查看我的代码,发现它请求
允许的\u URL
,然后发布到
搜索.do
,结果在HTML格式的结果页面中返回,因此解析开始。这是我的代码,我用nourl.com替换了真实的url

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语句,但我不确定除了“告诉函数稍后将再次使用它,而不会丢失它的数据”之外还有什么作用。任何想法都会有所帮助。谢谢你

这可能是因为您需要在规则中选择实际的URL,而不仅仅是
节点[…]用于生成条件,而不是选择某些内容。尝试:

//span[@class="pagelinks"]/a/@href
还有几点意见:

  • 你是如何找到这个HTML的?请注意查找XPath的工具,因为使用浏览器和scrapy检索的HTML可能不同,因为scrapy不处理Javascript(Javascript可用于生成您正在查看的页面,某些浏览器也尝试清理HTML)

    这里可能不是这样,但一个棘手问题中的“javascript表单”让我感到害怕。您应该始终检查
    response.body
    的内容是否符合预期

  • //div//div//div
    //div
    完全相同。这两条斜线意味着我们不再关心结构,只需在当前节点的子节点中选择所有名为div的节点。这也是为什么这里的
    //span[…]
    可能会起作用的原因


不过,我确实尝试过……它似乎没有什么帮助。我很确定scrapy没有处理任何javascript。表单已发布,结果为HTML格式。我检查了scrapy的
response.body
它和我用firefox检查它时得到的html是一样的。我不知道这是否有区别,但链接不是完整的url,例如
/methor app/results.jsp中4个url的xpath线索?d-5555p-2
格式您仔细检查了下一页的此url了吗?你能把它贴在这里吗?有时url包含cookie_会话,并且只能在一个浏览器中查看,您可以通过将url复制粘贴到另一个浏览器中来查看是否存在这种情况。如果url包含一些cookie,那么您需要一些其他的方法来提取链接,很可能爬行爬行器对于您的目的来说太有限了。我在这里写了一个类似问题的答案,你可以检查一下,也许会有帮助?