2015-02-25 2 views
0

Я использую следующий код, чтобы очистить этот сайт (http://profiles.ehs.state.ma.us/Profiles/Pages/ChooseAPhysician.aspx?Page=1); Однако, получаем следующую TypeError:«ТипError: объект« Rule »не итерируется» webscraping .aspx-страница в python

«Файл "C: \ Users \ Anaconda2 \ Lib \ сайта-пакеты \ SCRAPY \ вно \ пауки \ crawl.py", строка 83, в _compile_rules self._rules = [копировать .copy (r) для r в self.rules] TypeError: объект «Rule» не повторяется »

У меня нет кода, написанного на линии 83, поэтому задается вопросом, есть ли у кого-нибудь идеи о том, как разрешить проблема? Я использую Python 2.7 в Windows.

Спасибо!

from selenium import webdriver 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 
import scrapy 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LinkExtractor 
from scrapy.selector import HtmlXPathSelector 


class MdiMassSpider(CrawlSpider): 
    name = "MdiMass" 
    allowed_domains = ["http://profiles.ehs.state.ma.us/Profiles/Pages/FindAPhysician.aspx"] 
    start_urls = ["http://profiles.ehs.state.ma.us/Profiles/Pages/ChooseAPhysician.aspx?Page=1"] 
    driver = webdriver.Chrome() 

    rules = (Rule(LinkExtractor(allow=(".*http://profiles.ehs.state.ma.us/Profiles/Pages/PhysicianProfile.aspx?PhysicianID=.*,"))),) 
    # all pages to scrape follow the same: http://profiles.ehs.state.ma.us/Profiles/Pages/PhysicianProfile.aspx?PhysicianID=1311 
    #PhysicianID=XXXX 

    def __init__(self): 
     CrawlSpider.__init__(self) 
     self.driver = webdriver.Chrome() 

    #def __del__(self): 
    # self.selenium.quit() 
    # print self.verificationErrors 

    def parse(self, response): 
     self.driver.get('http://profiles.ehs.state.ma.us/Profiles/Pages/ChooseAPhysician.aspx?Page=1') 


    def parse(self): 
     select = Select(driver.find_element_by_xpath("//select[@id=\"ctl00_ContentPlaceHolder1_cmbDistance\"]")) 
     print select.options 
     print [o.text for o in select.options] 
     select.select_by_visible_text("15") 

     zip = driver.find_element_by_xpath("//*[@id=\"ctl00_ContentPlaceHolder1_txtZip\"]") 
     zip.send_keys("02109") 

     prim_care_chekbox = driver.find_element_by_xpath("//*[@id=\"ctl00_ContentPlaceHolder1_SpecialtyGroupsCheckbox_6\"]") 
     prim_care_chekbox.click() 

     find_phy_button = driver.find_element_by_xpath("//*[@id=\"ctl00_ContentPlaceHolder1_btnSearch\"]") 
     find_phy_button.click() 

     for sel in response.xpath("//*[@id=\"PhysicianSearchResultGrid\"]/tbody/tr[2]/td[1]/a"): 
      item = MdiMassItem() 
      item["phy_name"] = sel.xpaths("//*[@id=\"content\"]/center/p[1]").extract() 
      item["lic_status"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]/a[1]").extract() 
      item["lic_issue_date"] = driver.find.elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[1]/table/tbody/tr[3]/td[2]").extract() 
      item["prim_worksetting"] = driver.find.elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[1]/table/tbody/tr[5]/td[2]").extract() 
      item["npi"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[2]/table/tbody/tr[6]/td[2]").extract() 
      item["Med_sch_grad_date"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[3]/tbody/tr[3]/td/table/tbody/tr[2]/td[2]").extract() 
      item["Area_of_speciality"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[4]/tbody/tr[3]/td/table/tbody/tr/td[2]").extract() 
      item["link"] = driver.find_element_by_xpath("//*[@id=\"PhysicianSearchResultGrid\"]/tbody/tr[2]/td[1]/a").extract() 
      print item 

Edited Код:

from selenium import webdriver 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 
import scrapy 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LinkExtractor 
from scrapy.selector import HtmlXPathSelector 


class MdiMassSpider(CrawlSpider): 
    name = "MdiMass" 
    allowed_domains = ["http://profiles.ehs.state.ma.us/Profiles/Pages/FindAPhysician.aspx"] 
    start_urls = ["http://profiles.ehs.state.ma.us/Profiles/Pages/ChooseAPhysician.aspx?Page=1"] 

    rules = (Rule(LinkExtractor(allow=(".*http://profiles.ehs.state.ma.us/Profiles/Pages/PhysicianProfile.aspx?PhysicianID=.*"))),) 
    # all pages to scrape follow the same: http://profiles.ehs.state.ma.us/Profiles/Pages/PhysicianProfile.aspx?PhysicianID=1311 
    #PhysicianID=XXXX 

    def __init__(self): 
     CrawlSpider.__init__(self) 
     self.driver = webdriver.Chrome() 
     self.driver.get('http://profiles.ehs.state.ma.us/Profiles/Pages/ChooseAPhysician.aspx?Page=1') 

    def parse(self, response): 
     driver = self.driver 
     select = Select(self.driver.find_element_by_xpath("//select[@id=\"ctl00_ContentPlaceHolder1_cmbDistance\"]")) 
     print select.options 
     print [o.text for o in select.options] 
     select.select_by_visible_text("15") 

     zip = self.driver.find_element_by_xpath("//*[@id=\"ctl00_ContentPlaceHolder1_txtZip\"]") 
     zip.send_keys("02109") 

     prim_care_chekbox = self.driver.find_element_by_xpath("//*[@id=\"ctl00_ContentPlaceHolder1_SpecialtyGroupsCheckbox_6\"]") 
     prim_care_chekbox.click() 

     find_phy_button = self.driver.find_element_by_xpath("//*[@id=\"ctl00_ContentPlaceHolder1_btnSearch\"]") 
     find_phy_button.click() 

     for sel in response.xpath("//*[@id=\"PhysicianSearchResultGrid\"]/tbody/tr[2]/td[1]/a"): 
      item = MdiMassItem() 
      item["phy_name"] = sel.xpaths("//*[@id=\"content\"]/center/p[1]").extract() 
      item["lic_status"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]/a[1]").extract() 
      item["lic_issue_date"] = driver.find.elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[1]/table/tbody/tr[3]/td[2]").extract() 
      item["prim_worksetting"] = driver.find.elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[1]/table/tbody/tr[5]/td[2]").extract() 
      item["npi"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[2]/tbody/tr[3]/td/table/tbody/tr/td[2]/table/tbody/tr[6]/td[2]").extract() 
      item["Med_sch_grad_date"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[3]/tbody/tr[3]/td/table/tbody/tr[2]/td[2]").extract() 
      item["Area_of_speciality"] = driver.find_elements_by_xpaths("//*[@id=\"content\"]/center/table[4]/tbody/tr[3]/td/table/tbody/tr/td[2]").extract() 
      item["link"] = driver.find_element_by_xpath("//*[@id=\"PhysicianSearchResultGrid\"]/tbody/tr[2]/td[1]/a").extract() 
      print item 

Python Войти Сообщение:

C:\Users\Anaconda2\MdiMass>scrapy crawl MdiMass -o items.csv 
2015-02-26 01:11:47-0500 [scrapy] INFO: Scrapy 0.24.4 started (bot: MdiMass) 
2015-02-26 01:11:47-0500 [scrapy] INFO: Optional features available: ssl, http11, boto 
2015-02-26 01:11:47-0500 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'MdiMass.spiders', 'FEED_FORMAT': 'csv', 'SPIDER_M 
ODULES': ['MdiMass.spiders'], 'FEED_URI': 'items.csv', 'BOT_NAME': 'MdiMass'} 
2015-02-26 01:11:47-0500 [scrapy] INFO: Enabled extensions: FeedExporter, LogStats, TelnetConsole, CloseSpider, WebService, CoreStat 
s, SpiderState 
2015-02-26 01:11:49-0500 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMidd 
leware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMidd 
leware, ChunkedTransferMiddleware, DownloaderStats 
2015-02-26 01:11:49-0500 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLe 
ngthMiddleware, DepthMiddleware 
C:\Users\Anaconda2\MdiMass 
2015-02-26 01:11:49-0500 [scrapy] INFO: Enabled item pipelines: CsvWriterPipeline 
2015-02-26 01:11:49-0500 [MdiMass] INFO: Spider opened 
2015-02-26 01:11:49-0500 [MdiMass] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2015-02-26 01:11:49-0500 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2015-02-26 01:11:49-0500 [scrapy] DEBUG: Web service listening on 127.0.0.1:6080 
2015-02-26 01:11:49-0500 [MdiMass] DEBUG: Redirecting (302) to <GET http://profiles.ehs.state.ma.us/Profiles/Pages/FindAPhysician.as 
px> from <GET http://profiles.ehs.state.ma.us/Profiles/Pages/ChooseAPhysician.aspx?Page=1> 
2015-02-26 01:11:49-0500 [MdiMass] DEBUG: Crawled (200) <GET http://profiles.ehs.state.ma.us/Profiles/Pages/FindAPhysician.aspx> (re 
ferer: None) 
[<selenium.webdriver.remote.webelement.WebElement object at 0x0493B210>, <selenium.webdriver.remote.webelement.WebElement object at 
0x0493B0B0>, <selenium.webdriver.remote.webelement.WebElement object at 0x0493B1F0>, <selenium.webdriver.remote.webelement.WebElemen 
t object at 0x0493B110>, <selenium.webdriver.remote.webelement.WebElement object at 0x0493B150>, <selenium.webdriver.remote.webeleme 
nt.WebElement object at 0x0493B170>] 
[u'', u'5', u'10', u'15', u'30', u'50'] 
2015-02-26 01:11:50-0500 [MdiMass] INFO: Closing spider (finished) 
2015-02-26 01:11:50-0500 [MdiMass] INFO: Dumping Scrapy stats: 
     {'downloader/request_bytes': 575, 
     'downloader/request_count': 2, 
     'downloader/request_method_count/GET': 2, 
     'downloader/response_bytes': 19312, 
     'downloader/response_count': 2, 
     'downloader/response_status_count/200': 1, 
     'downloader/response_status_count/302': 1, 
     'finish_reason': 'finished', 
     'finish_time': datetime.datetime(2015, 2, 26, 6, 11, 50, 150000), 
     'log_count/DEBUG': 4, 
     'log_count/INFO': 7, 
     'response_received_count': 1, 
     'scheduler/dequeued': 2, 
     'scheduler/dequeued/memory': 2, 
     'scheduler/enqueued': 2, 
     'scheduler/enqueued/memory': 2, 
     'start_time': datetime.datetime(2015, 2, 26, 6, 11, 49, 134000)} 
2015-02-26 01:11:50-0500 [MdiMass] INFO: Spider closed (finished) 
+0

Почему 2 определения анализа? вы могли бы переместить self.driver.get в init? – aberna

+0

Хороший вопрос и предложение! Внесение изменений. Еще раз спасибо! – EricJohn

ответ

3

Проблема заключается в следующей строке.

rules = (Rule(LinkExtractor (allow=(" 
.*http://profiles.ehs.state.ma.us/Profiles/Pages/PhysicianProfile.aspx?PhysicianID=.*," 
)))) 

Вы пропустите позиционировали запятую. Правильный код:

rules = (Rule(LinkExtractor(allow=(" 
.*http://profiles.ehs.state.ma.us/Profiles/Pages/PhysicianProfile.aspx?PhysicianID=.*" 
))),) 

По этой поправке вы делаете правило итерабельным.

Хорошее определение итераторы здесь: (Build a Basic Python Iterator)

объекты итераторов в питоне соответствовать протоколу итератора, который в основном означает, что они обеспечивают два метода: __iter__() и next().

__iter__ возвращает объект итератора и неявно вызывается в начале циклов.

Метод next() возвращает следующее значение и неявно вызывается при каждом приращении цикла.
next() вызывает исключение StopIteration, когда больше нет значения для возврата, которое неявно захватывается контурами цикла, чтобы остановить итерацию.

+0

Спасибо за идею об исправлении и подробное объяснение! Я внес изменения (сохранил изменение), перезапустил код, но я все еще получаю следующую ошибку. Я даже попробовал # от «rules = (Rule (LinkExtractor (allow = («. * Http: // ....)))) и все еще получаю следующее. Любые идеи ?: C: \ Users \ Anaconda2 \ MdiMass> scrapy crawl MdiMass Traceback (последний последний звонок): «Файл» C: \ Users \ Anaconda2 \ lib \ site-packages \ scrapy \ contrib \ spiders \ crawl.py ", строка 83, в _compi le_rules self._rules = [copy.copy (r) для r в self.rules] ТипError: объект «Rule» не является итерабельным – EricJohn

+0

Код в ответе был явно протестирован. Я сделаю двойную проверку вашего сообщения об ошибке – aberna

+0

Обновление: вы были верны abt. the, "rule = ...))),)." редактировать. Он решил, «TypeError!» Благодаря!Я должен был перезапустить, но теперь получаю другую ошибку (относительно конвейеров): Файл «C: \ Users \ Anaconda2 \ MdiMass \ MdiMass \ pipelines.py», строка 15 self.csvwriter.writerow ([item ['phy_name'] [0], item ['lic_status'] [0], item ['lic_issue_date'] [0], item ['prim_worksetting'] [0], ite m ['npi'] [0], item ['Med_sch_grad_date '] [0], item [' Area_of_speciality '] [0], item [' link '] [0]) ^^ SyntaxError: недействительный синтаксис – EricJohn

Смежные вопросы