【问题标题】:Change value of an HTML element with scrapy使用 scrapy 更改 HTML 元素的值
【发布时间】:2017-05-28 19:00:08
【问题描述】:

我正在尝试从该网站抓取数据:Website link

我想下载特定日期的所有 PDF 文件。

虽然我设法从第一页获取文件并正确下载它们,但我无法更改日期,因此我可以返回之前的日期并获取旧的 PDF。

我试过这条线:

scrapy.FormRequest.from_response(response,formxpath='//table//td//input[@type="text"]', formdata={'value': "20.05.2017"}, clickdata={'type':'submit'}, method='POST')

在scrapy shell中,但view(response)总是显示当前日期。

我不确定这是否正确,我是scrapy的新手,我正在努力解决问题。我认为该方法是正确的,因为当我更改日期时链接不会更改,因此应该是POST 而不是GET

关于如何让它发挥作用的任何想法?
我认为FormRequest() 将是这里的最佳选择,但我没有在网上看到任何其他示例,并且scrapy 网站上的文档对我没有太大帮助,所以我尝试研究涉及登录凭据的示例,他们都用FormRequest.from_response()

PS:我已经附上了与日期更改有关的 HTML 代码段的屏幕截图。

【问题讨论】:

    标签: python scrapy web-crawler scrapy-spider scrapy-shell


    【解决方案1】:

    输入字段名称是“日期”,而不是“值”:

        <form id="dailyFekForm" name="dailyFekForm" action="/idocs-nph/search/dailyFekForm.html" method="post">
            <br>
            <div>
    
            </div>  
          <div class="non-printable" style="padding-left:20px;">
                <table>
                    <tr>
                        <td style="font-size:100%; color:#3399FF;" align="left" >
                            <table>
                                <tr>
                                    <td valign="center" style="font-size:100%; color:#3399FF;" ><b>Ημερομηνία Κυκλοφορίας</b></td>
                                    <td>
                                        <img title="Επιλέξτε ημερομηνία για ημερήσια κυκλοφορία" border="0" src="/idocs-nph/images/tooltip.gif" >
                                    </td>
                                </tr>
                            </table> 
                        </td>
                        <td><input id="date" name="date" type="text" value="29.05.2017"/></td>
                        <td><img src="/idocs-nph/images/admin/calendar.gif" id="triggerDate"/></td>
                        <td><input class="save" type="submit" value="Αναζήτηση" name="search" id="search"/></td>
                    </tr>
                </table>
    

    您还可以使用其开发工具检查浏览器发送的内容:http://imgur.com/a/ztDtF(检查底部的“表单数据”)

    因此,您可以使用:

    scrapy.FormRequest.from_response(response,formdata={'date': "19.05.2017"})
    

    使用 scrapy shell 的示例会话,显示不同的表行:

    $ scrapy shell http://www.et.gr/idocs-nph/search/dailyFekForm.html
    >>> from pprint import pprint
    >>> pprint(response.css('table#result_table tr:not(.prop) td b').xpath('normalize-space()').getall())
    ['ΦΕΚ A 77 - 26.05.2017',
     'ΦΕΚ B 1836 - 25.05.2017',
     'ΦΕΚ B 1837 - 25.05.2017',
     (...)
     'ΦΕΚ Α.Α.Π. 112 - 25.05.2017',
     'ΦΕΚ Α.Α.Π. 113 - 26.05.2017',
     'ΦΕΚ Α.Α.Π. 114 - 26.05.2017',
     'ΦΕΚ Α.Α.Π. 115 - 26.05.2017']
    >>> fetch(scrapy.FormRequest.from_response(response,formdata={'date': "19.05.2017"}))
    2017-05-29 14:42:50 [scrapy.core.engine] DEBUG: Crawled (200) <POST http://www.et.gr/idocs-nph/search/dailyFekForm.html> (referer: None) ['partial']
    >>> pprint(response.css('table#result_table tr:not(.prop) td b').xpath('normalize-space()').getall())
    ['ΦΕΚ A 72 - 19.05.2017',
     'ΦΕΚ A 73 - 19.05.2017',
     'ΦΕΚ A 74 - 19.05.2017',
     (...)
     'ΦΕΚ Υ.Ο.Δ.Δ. 234 - 18.05.2017',
     'ΦΕΚ Α.Α.Π. 105 - 16.05.2017',
     'ΦΕΚ Α.Α.Π. 108 - 16.05.2017']
    >>> fetch(scrapy.FormRequest.from_response(response,formdata={'date': "16.05.2017"}))
    2017-05-29 14:45:53 [scrapy.core.engine] DEBUG: Crawled (200) <POST http://www.et.gr/idocs-nph/search/dailyFekForm.html> (referer: None) ['partial']
    >>> pprint(response.css('table#result_table tr:not(.prop) td b').xpath('normalize-space()').getall())
    ['ΦΕΚ A 69 - 16.05.2017',
     'ΦΕΚ B 1638 - 15.05.2017',
     'ΦΕΚ B 1639 - 15.05.2017',
     (...)
     'ΦΕΚ Υ.Ο.Δ.Δ. 228 - 16.05.2017',
     'ΦΕΚ Υ.Ο.Δ.Δ. 229 - 16.05.2017',
     'ΦΕΚ Α.Α.Π. 102 - 15.05.2017']
    >>> 
    

    【讨论】:

    • 非常感谢您的宝贵时间。这对你有用吗?我在 Scrapy shell 中尝试过,当我使用视图(响应)时,它会返回相同的日期。我不应该看到改变的吗?
    • 没有使用 fetch.. 我觉得自己像个白痴,我找这个错误已经 3 天了。非常感谢,真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多