如何通过点击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()

使用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上 xpath。使用相对路径来避免它们!
  2. 正如错误消息所述,您不能简单地从 Spider 中产生该 xpath 的结果。您必须返回请求、基本项、字典或无。

这是我为after_button编写的代码:

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

最新更新