表单提交后使用Scrapy抓取数据

时间:2015-10-20 15:54:24

标签: scrapy

我试图从列表详细信息页面抓取内容,只有点击“查看”视图才能查看该内容。触发表单提交的按钮。我是Python和Scrapy的新手

示例标记

<li><h3>Abc Widgets</h3>
     <form action="/viewlisting?id=123" method="post">
        <input type="image" src="/images/view.png" value="submit" >
     </form>
</li>

我在Scrapy中的解决方案是提取表单操作,然后使用Request返回带有回调的页面,以便为所需内容进行解析。但是我遇到了一些问题

  1. 我收到以下错误&#34;请求网址必须是str或unicode&#34;

  2. 其次,当我对URL进行硬编码以克服上述问题时,似乎我的解析功能正在返回看似列表的内容

  3. 这是我的代码 - 对真实网址的反应

    from scrapy.spiders import Spider
    from scrapy.selector import Selector
    from scrapy.http import Request
    from wfi2.items import Wfi2Item
    
    class ProfileSpider(Spider):
        name = "profiles"
    
        allowed_domains = ["wfi.com.au"]
        start_urls = ["http://example.com/wps/wcm/connect/internet/wfi/Contact+Us/Find+Your+Local+Office/findYourLocalOffice.jsp?state=WA",
        "http://example.com/wps/wcm/connect/internet/wfi/Contact+Us/Find+Your+Local+Office/findYourLocalOffice.jsp?state=VIC",
        "http://example.com/wps/wcm/connect/internet/wfi/Contact+Us/Find+Your+Local+Office/findYourLocalOffice.jsp?state=QLD",
        "http://example.com/wps/wcm/connect/internet/wfi/Contact+Us/Find+Your+Local+Office/findYourLocalOffice.jsp?state=NSW",
        "http://example.com/wps/wcm/connect/internet/wfi/Contact+Us/Find+Your+Local+Office/findYourLocalOffice.jsp?state=TAS"
        "http://example.com/wps/wcm/connect/internet/wfi/Contact+Us/Find+Your+Local+Office/findYourLocalOffice.jsp?state=NT"
        ]
    
    
    
        def parse(self, response):
    
            hxs =  Selector(response)
            forms = hxs.xpath('//*[@id="area-managers"]//*/form')
    
            for form in forms:
    
                action = form.xpath('@action').extract()
                print "ACTION: ", action
                #request = Request(url=action,callback=self.parse_profile)
                request = Request(url=action,callback=self.parse_profile)
                yield request
    
        def parse_profile(self, response):
            hxs =  Selector(response)
            profile = hxs.xpath('//*[@class="contentContainer"]/*/text()')
    
            print "PROFILE", profile
    

1 个答案:

答案 0 :(得分:2)

  
      
  1. 我收到以下错误“请求网址必须是str或unicode”
  2.   

请查看 request = Request(url=response.urljoin(action[0]), callback=self.parse_profile) 的scrapy文档。 It says:“序列化并返回匹配的节点作为列表的unicode字符串”(由我添加粗体)。

列表的第一个元素可能就是你想要的。所以你可以这样做:

SelectorList
  
      
  1. 其次,当我硬编码URL以克服上述问题时,似乎是我的   解析函数返回看似列表的内容
  2.   

根据xpath的文档,它是extract()。将xpath添加到{{1}},您将获得包含文本标记的列表。最终,您希望在进一步处理之前清理并加入列出的元素。