首页 > 解决方案 > 如何通过 Scrapy 点击获取数据

问题描述

因此,我试图从页面中获取更多数据,具体取决于我使用 Scrapy 在下拉列表中选择的内容。

访问:http ://grace.itam.mx/EDSUP/BWZKSENP.P_Horarios1?s=1416

在下面的代码中,首先我得到了下拉列表的所有元素,它工作正常。

但我也想在选择一个元素后获取信息,然后单击 submbit 以转到带有数据表的新页面。反正有这样做吗?

# run this file as
# scrapy runspider scrappy-itam.py -t csv -o s4-out.csv
from scrapy.spiders import Spider
from collections import OrderedDict
class MySpider(Spider):
    name = 's4'
    allowed_domains = ['grace.itam.mx']
    start_urls = [ "http://grace.itam.mx/EDSUP/BWZKSENP.P_Horarios1?s=1416"]

    def parse(self, response):
        items = []
        for cour in response.xpath("//div[@class='pagebodydiv']/form/select/option/text()"):
             item = OrderedDict()
             info=cour.extract()
             course=info.split('-')
             item['Department']=course[0]
             item['Course']=course[2]
             items.append(item)
        return items

编辑: 这里我使用 FormRequest 来解析新页面。

lass MySpider(Spider):
name = 's4'
allowed_domains = ['grace.itam.mx']
start_urls = [ "http://grace.itam.mx/EDSUP/BWZKSENP.P_Horarios1?s=1416"]

def parse(self, response):
    for c in response.xpath("//div[@class='pagebodydiv']/form/select/option/text()"):
         item = OrderedDict()
         info=c.extract()
         yield scrapy.FormRequest.from_response(response,formdata={'TXT_MATERIA':info},callback=self.after_button)


def after_button(self,response):
    yield response.xpath("//div[3]/table[1]/tbody/tr[1]/td[1]/b/text()").extract()

标签: pythonweb-scrapingscrapy

解决方案


使用 Scrapy FormRequest.from_response将要选择的元素中的值作为参数。这样,您可以在您的蜘蛛中使用另一个方法解析其他页面的内容。

编辑1:

在你FormRequest那里有一个错误。将其更改为:

scrapy.FormRequest.from_response(response,formdata={'txt_materia':info, 's' : '1416'})

我不认为添加s : 1416参数是必需的,但txt_materia应该是小写的。当我将它用作上面的代码时,响应是正确的。

在你的after_button方法中,我发现了两个小错误:

  1. 不要在tbody. 使用相对路径来避免它们!
  2. 正如错误消息所述,您不能简单地从 Spider 中产生该 xpath 的结果。您必须返回 Request、BaseItem、dict 或 None。

这是我写的代码after_button

def after_button(self,response):
    yield { "text" : response.xpath("//div[3]/table[1]//tr[1]/td[1]/b/text()").extract_first() }

推荐阅读