2016-11-02 4 views
1

Я использую scrapy mix with selenium. Я хочу запустить функцию разбора во многих задачах в параллелизме. Я хочу открыть много URL одновременно. Поэтому я использую функцию Pool.map для сопоставления функции parse() с массивом (1,2,3). Но смущающая вещь - моя функция передается объектом HttpResponse методом scrapy, поэтому он не может передать аргумент i функцией Pool.map(). Я помещаю свою функцию map() в мой класс паука или из нее. но я не знаю, как это сделать.Выполнение параллельной функции синтаксиса python scrapy

class FacebookSpider(scrapy.Spider): 
    name = 'facebk' 
    start_urls = ['https://www.facebook.com'] 
    options = Options() 
    options.add_argument("--disable-notifications") 
    client = MongoClient() 
    db = client.test 
    original_usr = db.user 

    def parse(self,i): 
     driver = webdriver.Chrome(chrome_options=self.options) 
     self.logger.info("executing") 
     pickle.dump(self.driver.get_cookies() , open("cookies.pkl","wb")) 
     try: 
     for target in self.original_usr.find().limit(3).skip(i*3): 
      self.logger.info("email:"+target['email']) 
      url = "https://www.facebook.com/search/people/?  q="+target['email'] 
      self.driver.get(url) 
      cookies = pickle.load(open("cookies.pkl", "rb")) 
      for cookie in cookies: 
       self.driver.add_cookie(cookie) 
      self.parse_pages(url) 
     finally: 
     driver.close() 

if __name__ == '__main__':   
    target_nums= range(2) 
    pool = ThreadPool(2) 
    fs = FacebookSpider() 
    pool.map(fs.parse,target_nums) 
    pool.close() 
    pool.join() 

Он получил сообщение об ошибке:

Traceback (most recent call last): 
File "C:\Users\warrior\AppData\Local\Enthought\Canopy\User\lib\site- packages\twisted\internet\defer.py", line 588, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "D:\mega folder\webcrawler\tutorial\tutorial\spiders\facebook_spider -  Copy (3).py", line 56, in parse 
for target in self.original_usr.find().limit(3).skip(i*3): 
TypeError: unsupported operand type(s) for *: 'HtmlResponse' and 'int' 

Если я использовать бассейн в моем классе паука вместо того, чтобы создать новый экземпляр паука Facebook, он получил TypeError ошибки: синтаксический анализ() занимает ровно 2 аргумента (1 приведена). Пожалуйста, помогите мне. благодаря!

+0

проблема заключается в том, что функция parse автоматически принимает объект htmlresponse как аргумент, поэтому здесь переменная i - это тип htmlresponse, а не int. Как этого избежать? –

ответ

1

Одна из проблем заключается в создании экземпляра FacebookSpider. На самом деле, вы не создаете экземпляр FacebookSpider и пытаетесь получить доступ к методу элемента анализа.

if __name__ == '__main__':   
    target_nums= range(2) 
    pool = ThreadPool(2) 
    fs = FacebookSpider() 
    pool.map(fs.parse,target_nums) 
    pool.close() 
    pool.join() 
+0

привет, даже когда я использую(), он все тот же –

+0

Изменилась ли ошибка после внесения изменений? Более того, вы должны включить весь стек исключений в вопрос, чтобы получить дополнительную информацию о проблеме. –

+0

Да. я его отредактировал –