如何通过Scrapy

时间:2018-10-23 02:28:51

标签: python web-scraping scrapy

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

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

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

但是我也想在选择一个Element然后单击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()

1 个答案:

答案 0 :(得分:0)

使用Scrapy FormRequest.from_response,将要选择的Element中的值用作参数。这样,您就可以使用Spider中的另一种方法来解析另一页的内容。

编辑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的结果。您必须返回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() }