我遇到了问题。我正在使用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语句,但我不确定除了“告诉函数它将在以后再次使用而不丢失其数据”之外的其他功能“任何想法都会有所帮助。谢谢!!!
答案 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[...]
可以解决问题的原因。