Scrapy,javascript表单,不爬网下一页
我有个问题。我使用scrapy从表单搜索后显示的HTML表中提取数据。问题是它不会继续爬网到下一页。我尝试了多种规则组合。我理解,不建议覆盖CrawlSpider中的默认解析逻辑。我已经找到了许多解决其他问题的答案,但是,我还没有找到一个解决方案,其中必须首先出现一个表单帖子。我查看我的代码,发现它请求Scrapy,javascript表单,不爬网下一页,scrapy,Scrapy,我有个问题。我使用scrapy从表单搜索后显示的HTML表中提取数据。问题是它不会继续爬网到下一页。我尝试了多种规则组合。我理解,不建议覆盖CrawlSpider中的默认解析逻辑。我已经找到了许多解决其他问题的答案,但是,我还没有找到一个解决方案,其中必须首先出现一个表单帖子。我查看我的代码,发现它请求允许的\u URL,然后发布到搜索.do,结果在HTML格式的结果页面中返回,因此解析开始。这是我的代码,我用nourl.com替换了真实的url from scrapy.contrib.spid
允许的\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[…]
response.body
它和我用firefox检查它时得到的html是一样的。我不知道这是否有区别,但链接不是完整的url,例如/methor app/results.jsp中4个url的xpath线索?d-5555p-2
格式您仔细检查了下一页的此url了吗?你能把它贴在这里吗?有时url包含cookie_会话,并且只能在一个浏览器中查看,您可以通过将url复制粘贴到另一个浏览器中来查看是否存在这种情况。如果url包含一些cookie,那么您需要一些其他的方法来提取链接,很可能爬行爬行器对于您的目的来说太有限了。我在这里写了一个类似问题的答案,你可以检查一下,也许会有帮助?