2013-07-16 18 views
3

我已經創建了一個蜘蛛,它收集了具有匹配電話號碼的公司名稱列表。然後將其保存到CSV文件。使用來自相同URL的多個POST數據進行刮取

我然後想要使用CSV文件中的電話號碼作爲POST數據從另一個網站上抓取數據。我希望它通過相同的起始URL進行循環,但只是抓取每個電話號碼生成的數據,直到CSV文件中沒有更多數字。

這是我這麼遠:

from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from scrapy.http import FormRequest 
from scrapy.selector import HtmlXPathSelector 
from scrapy import log 
import sys 
from scrapy.shell import inspect_response 
from btw.items import BtwItem 
import csv 

class BtwSpider(BaseSpider): 
    name = "btw" 
    allowed_domains = ["siteToScrape.com"] 
    start_urls = ["http://www.siteToScrape.com/broadband/broadband_checker"] 

    def parse(self, response): 
     phoneNumbers = ['01253873647','01253776535','01142726749'] 

     return [FormRequest.from_response(response,formdata={'broadband_checker[phone]': phoneNumbers[1]},callback=self.after_post)] 


    def after_post(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//div[@id="results"]') 
     items = [] 
     for site in sites: 
      item = BtwItem() 

      fttcText = site.select("div[@class='content']/div[@id='btfttc']/ul/li/text()").extract() 

      # Now we will change the text to be a boolean value 
      if fttcText[0].count('not') > 0: 
       fttcEnabled=0 
      else: 
       fttcEnabled=1 

      item['fttcAvailable'] = fttcEnabled 
      items.append(item) 
     return items 

在分鐘,我剛纔一直試圖讓這個循環通過列表(PHONENUMBERS),但我還沒有設法讓那工作,所以遠。一旦我知道如何做到這一點,我就可以自己將它從CSV文件中提取出來。在當前狀態下,它僅使用列表中索引爲1的phoneNumber。

+0

你能澄清一下這個問題嗎?您可以使用'for phoneNumbers:'中的''來遍歷Python中的列表。不過,我懷疑這不是你要問的。 – ChrisP

+0

我能夠運行上面的代碼沒有任何錯誤,所以什麼不工作? – Talvalin

回答

1

假設你有一個phones.csv文件,電話在它:

01253873647 
01253776535 
01142726749 

這是你的蜘蛛:

import csv 
from scrapy.item import Item, Field 

from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from scrapy.http import FormRequest 
from scrapy.selector import HtmlXPathSelector 


class BtwItem(Item): 
    fttcAvailable = Field() 
    phoneNumber = Field() 


class BtwSpider(BaseSpider): 
    name = "btw" 
    allowed_domains = ["samknows.com"] 

    def start_requests(self): 
     yield Request("http://www.samknows.com/broadband/broadband_checker", self.parse_main_page) 

    def parse_main_page(self, response): 
     with open('phones.csv', 'r') as f: 
      reader = csv.reader(f) 
      for row in reader: 
       phone_number = row[0] 
       yield FormRequest.from_response(response, 
               formdata={'broadband_checker[phone]': phone_number}, 
               callback=self.after_post, 
               meta={'phone_number': phone_number}) 

    def after_post(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//div[@id="results"]') 

     phone_number = response.meta['phone_number'] 
     for site in sites: 
      item = BtwItem() 

      fttc = site.select("div[@class='content']/div[@id='btfttc']/ul/li/text()").extract() 
      item['phoneNumber'] = phone_number 
      item['fttcAvailable'] = 'not' in fttc[0] 

      yield item 

這裏是正在運行之後刮掉:

{'fttcAvailable': False, 'phoneNumber': '01253873647'} 
{'fttcAvailable': False, 'phoneNumber': '01253776535'} 
{'fttcAvailable': True, 'phoneNumber': '01142726749'} 

的想法是使用start_requests颳去主頁面,然後讀取csv文件line-by在回撥中爲yield新的Requests爲每個電話號碼(csv行)。此外,通過phone_number通過meta字典的回調,以便將其寫入Item字段(我認爲你需要這個來區分項目/結果)。

希望有所幫助。

+0

謝謝你。它完美的工作! – James

相關問題