Scrappy - пауки застревают после выдачи запроса и функция обратного вызова не работает - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над Scrapy от 2 до 3 недель со следующими зависимостями:

  1. Python 2.7
  2. Витая 17.9.0
  3. Lxml 4.1.1
  4. Криптография 2.1.4

Теперь я обновил свои зависимости до

  1. Python 3.5.2
  2. Витая 17,9,0
  3. Lxml 4.2.1
  4. Криптография 2.2.2

После обновления моих зависимостей мои пауки застряли. Он застревает после выдачи запросов, также не вызывается функция обратного вызова, и паук переходит в бесконечное состояние ожидания.

ScrapperRequestCode :

def start_requests(self):
    driver = webdriver.Chrome()
    driver.get(**)
    urls = driver.find_elements_by_xpath("//div[contains(@class, 'media__item')]//a")
    time_list = driver.find_elements_by_xpath("//span[contains(@class, 'timestamp--time')]")
    index = 0
    for url in urls:
        url_href = str(url.get_attribute('href')).replace('http:', 'https:')
        media_url = url.find_element_by_xpath("./*").get_attribute('src')
        text = url.find_element_by_xpath("./*").get_attribute('alt')
        try:
            time = time_list[index].get_attribute('title')
            time = str(datetime.datetime.strptime(str(time).lstrip(), '%b %d, %Y %I:%M%p'))
            index = index + 1
        except IndexError:
            time = ''
            pass
        if url_href != "None":
            count = News.objects.filter(url__icontains=url_href).count()
            if count == 0:
                headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64) '
                                         'AppleWebKit/537.36 (KHTML, like Gecko)'
                                         ' Chrome/60.0.3112.101 Safari/537.36'}

                request = Request(url_href, callback=self.parse, headers=headers, dont_filter=True)
                request.meta['url'] = url_href
                request.meta['text'] = text
                request.meta['media_url'] = media_url
                request.meta['time'] = time
                yield request
    sleep(5)
    driver.close()

Код функции разбора:

def parse(self, response):
    print(response, "RESPONSE===========================")
    summary_list = []
    story_url = response.meta['url']
    story_title = response.meta['text']
    media_url = response.meta['media_url']
    time = response.meta['time']
    try:
        dummay_news = News.objects.get(url=story_url)
        return
    except News.DoesNotExist:
        dummay_news = News()
        story_p_tags = response.xpath("//div[contains(@class,'story__content')]/p/text()")
        for p in story_p_tags:
            summary_list.append(p.extract())

        dummay_news.source = 'xyz'
        dummay_news.time = time
        dummay_news.title = story_title
        dummay_news.url = story_url
        dummay_news.set_summary(summary_list)
        if media_url:
            dummay_news.media_url = media_url
        dummay_news.save()

    yield dummay_news

Скрепер застревает после этого запроса :

2018-05-02 13:47:18 [selenium.webdriver.remote.remote_connection] DEBUG: Finished Request
2018-05-02 13:47:18 [selenium.webdriver.remote.remote_connection] DEBUG: GET http://127.0.0.1:35091/session/657a553b268a671e8117dba401ceeee8/element/0.8764352324704219-426/attribute/alt {"id": "0.8764352324704219-426", "name": "alt", "sessionId": "657a553b268a671e8117dba401ceeee8"}
2018-05-02 13:47:18 [selenium.webdriver.remote.remote_connection] DEBUG: Finished Request
2018-05-02 13:47:18 [selenium.webdriver.remote.remote_connection] DEBUG: GET http://127.0.0.1:35091/session/657a553b268a671e8117dba401ceeee8/element/0.8764352324704219-226/attribute/title {"id": "0.8764352324704219-226", "name": "title", "sessionId": "657a553b268a671e8117dba401ceeee8"}
2018-05-02 13:47:18 [selenium.webdriver.remote.remote_connection] DEBUG: Finished Request

Кроме того, после этой ошибки функция обратного вызова не запускается и застревает навсегда.
Любая помощь высоко ценится, заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Не закрывайте драйвер в start_requests. Вы можете закрыть и выйти так, как это

def __del__(self):
    self.driver.close()
    self.driver.quit()

И ваш yield dummay_news должен быть в except

try:
    dummay_news = News.objects.get(url=story_url)
    return
except News.DoesNotExist:
    dummay_news = News()
    story_p_tags = response.xpath("//div[contains(@class,'story__content')]/p/text()")
    for p in story_p_tags:
        summary_list.append(p.extract())

    dummay_news.source = 'xyz'
    dummay_news.time = time
    dummay_news.title = story_title
    dummay_news.url = story_url
    dummay_news.set_summary(summary_list)
    if media_url:
        dummay_news.media_url = media_url
    dummay_news.save()

    yield dummay_news
0 голосов
/ 03 мая 2018

вы делаете driver.close() в вашем методе start_requests (). Тем не менее, я думаю, что вы не должны закрывать селен драйвер слишком рано. Удалите эту строку и попробуйте.

...