そのため、Scrapyを使用してドロップダウンリストで選択した内容に応じて、ページからより多くのデータを取得しようとしています。
訪問:http://grace.itam.mx/EDSUP/BWZKSENP.P_Horarios1?s = 1416
以下のコードでは、最初にドロップダウンリストのすべての要素を取得し、正常に機能しています。
ただし、要素を選択し、サブビットをクリックしてデータテーブルのある新しいページに移動した後の情報も取得したいと思います。とにかくそれをすることはありますか?
# 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
方法で、私は2つの小さな間違いを見つけました:
tbody
。それらを回避するために相対パスを使用してください!これは私が書いたコードですafter_button
:
def after_button(self,response):
yield { "text" : response.xpath("//div[3]/table[1]//tr[1]/td[1]/b/text()").extract_first() }
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加