2014-08-06 3 views
5

Есть 10 ссылок, которые я хочу, чтобы поймать
Когда я бег паука, я могу получить ссылки в JSon файл, но все еще есть ошибки, как это:
It Кажется, что селен запускается дважды. В чем проблема?
Пожалуйста, руководство меня Спасибоселен: socket.error: [Errno 61] Соединение отклонено

2014-08-06 10:30:26+0800 [spider2] DEBUG: Scraped from <200 http://www.test/a/1> 
{'link': u'http://www.test/a/1'} 
2014-08-06 10:30:26+0800 [spider2] ERROR: Spider error processing <GET 
http://www.test/a/1> 
Traceback (most recent call last): 
........ 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 571, in create_connection 
    raise err 
socket.error: [Errno 61] Connection refused 

Вот мой код:

from selenium import webdriver 
from scrapy.spider import Spider 
from ta.items import TaItem 
from selenium.webdriver.support.wait import WebDriverWait 
from scrapy.http.request import Request 

class ProductSpider(Spider): 
    name = "spider2" 
    start_urls = ['http://www.test.com/'] 
    def __init__(self): 
     self.driver = webdriver.Firefox() 

    def parse(self, response): 
     self.driver.get(response.url) 
     self.driver.implicitly_wait(20) 
     next = self.driver.find_elements_by_css_selector("div.body .heading a") 
     for a in next: 
      item = TaItem()  
      item['link'] = a.get_attribute("href")  
      yield Request(url=item['link'], meta={'item': item}, callback=self.parse_detail) 

    def parse_detail(self,response): 
     item = response.meta['item'] 
     yield item 
     self.driver.close() 
+0

Почему вы вызываете 'self.driver.close()' в 'parse_detail()'? – alecxe

+0

Я удаляю эту строку. И ошибка исчезает. Это значит, что мне не нужно ее закрывать или где ее закрыть? – user2492364

ответ

3

Проблема заключается в том, что вы закрываете драйвер слишком рано.

Вы должны закрыть его только тогда, когда паук заканчивает его работу, слушать spider_closed сигнала:

from scrapy import signals 
from scrapy.xlib.pydispatch import dispatcher 
from selenium import webdriver 
from scrapy.spider import Spider 
from ta.items import TaItem 
from scrapy.http.request import Request 


class ProductSpider(Spider): 
    name = "spider2" 
    start_urls = ['http://www.test.com/'] 
    def __init__(self): 
     self.driver = webdriver.Firefox() 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 

    def parse(self, response): 
     self.driver.get(response.url) 
     self.driver.implicitly_wait(20) 
     next = self.driver.find_elements_by_css_selector("div.body .heading a") 
     for a in next: 
      item = TaItem()  
      item['link'] = a.get_attribute("href")  
      yield Request(url=item['link'], meta={'item': item}, callback=self.parse_detail) 

    def parse_detail(self,response): 
     item = response.meta['item'] 
     yield item 

    def spider_closed(self, spider): 
     self.driver.close() 

Смотрите также: scrapy: Call a function when a spider quits.

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