Я использую 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 приведена). Пожалуйста, помогите мне. благодаря!
проблема заключается в том, что функция parse автоматически принимает объект htmlresponse как аргумент, поэтому здесь переменная i - это тип htmlresponse, а не int. Как этого избежать? –