Scrapy и перенаправление - PullRequest
       3

Scrapy и перенаправление

0 голосов
/ 16 февраля 2020

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

Я использую его для сбора средних данных о заголовках статей, именах, хлопках, ответах и ​​т. Д. c, которые находятся на одной странице html. Но чтобы получить теги, мне нужно было go для каждой отдельной статьи. Большинство тегов мне удалось получить, но есть пара статей, которые ссылаются на www.didascience.com вместо среднего веб-сайта. Это делает странный маленький редирект, когда ссылка на статью, например,

https://towardsdatascience.com/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd?source=tag_archive---------1-----------------------

Затем он перенаправляет на: https://towardsdatascience.com/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd

Теперь я заметил, что в статьях, которые перенаправляют на страницу со статистикой по направлению к данным, он не захватывает теги страниц. Селектор тега css точно такой же, как и другие статьи среднего уровня, которые он захватывает.

Когда я go нахожусь на оболочке scrapy и пытаюсь получить одну из статей, которая ссылается на статью о сбое, я получаю этот ответ.

fetch("https://towardsdatascience.com/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd? 
source=tag_archive---------1-----------------------")



**OUTPUT**

2020-02-16 11:52:31 [scrapy_user_agents.middlewares] DEBUG: Assigned User-Agent Mozilla/5.0 (Windows 
NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36

2020-02-16 11:52:31 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET 
https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Fcython-a- 
speed-up-tool-for-your-python-function-9bab64364bfd%3Fsource%3Dtag_archive---------1----------------- 
------> from <GET https://towardsdatascience.com/cython-a-speed-up-tool-for-your-python-function- 
9bab64364bfd?source=tag_archive---------1----------------------->

2020-02-16 11:52:31 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET 
https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Fcython-a- 
speed-up-tool-for-your-python-function-9bab64364bfd%3Fsource%3Dtag_archive---------1----------------- 
------>

Файл robots.txt находится здесь

User-Agent: *
Disallow: /m/
Disallow: /me/
Disallow: /@me$
Disallow: /@me/
Disallow: /*/edit$
Disallow: /*/*/edit$
Disallow: /r/
Disallow: /t/
Disallow: /search?q$
Disallow: /search?q=
Allow: /_/
Allow: /_/api/users/*/meta
Allow: /_/api/users/*/profile/stream
Allow: /_/api/posts/*/responses
Allow: /_/api/posts/*/responsesStream
Allow: /_/api/posts/*/related
Sitemap: https://towardsdatascience.com/sitemap/sitemap.xml

Я пробовал несколько способов работы с перенаправлениями с использованием scrapy с этого веб-сайта и не имел никакого успеха. Вот код для реального сканера.

CODE

 import scrapy
 from dateutil.parser import parse
 from medium.items import MediumItem
 from scrapy.spiders import CrawlSpider

 class DataSpider(CrawlSpider):

    name = 'data'
    allowed_domains = ['medium.com', 'towardsdatascience.com']
    start_urls = ['https://medium.com/tag/python/archive/2020/02/01']

    def parse(self,response):


    articles = response.xpath('//div[@class="postArticle postArticle--short js-postArticle js- 
    trackPostPresentation js-trackPostScrolls"]')

    for article in articles:

        item = MediumItem()

        if article.css("div > h3::text").extract_first():
             item['Title'] = article.css("div > h3::text").extract_first()

             item['Name'] = article.xpath('.//a[@class="ds-link ds-link--styleSubtle link link-- 
             darken link--accent u-accentColor--textNormal u-accentColor--  
             textDarken"]/text()').extract_first()

             item['Date'] = parse(article.css('time::text').extract_first()).date()

             item['Read'] = article.css("span::attr(title)").extract_first()

             item['Publication'] = article.xpath('.//a[@class="ds-link ds-link--styleSubtle link-- 
             darken link--accent u-accentColor--textNormal"]/text()').extract_first()

             item['Claps'] = articles.xpath('.//button[@class="button button--chromeless u-baseColor- 
             -buttonNormal js-multirecommendCountButton u- 
             disablePointerEvents"]/text()').extract_first()

             item['Responses'] = article.xpath('.//a[@class="button button--chromeless u-baseColor-- 
            buttonNormal"]/text()').extract_first()

             link = article.xpath('.//a[@class="button button--smaller button--chromeless u- 
             baseColor--buttonNormal"]/@href').extract_first()

            yield response.follow(link, callback=self.get_link, meta={'item':item})


  def get_link(self,response):
        item = response.meta['item']
        item['Tags'] = response.css("ul > li > a::text").getall()
        yield item

Любая помощь в получении тегов с тех страниц, как та, на которую ссылается, будет отличной.

1 Ответ

1 голос
/ 17 февраля 2020

Благодаря комментарию @furas. У них правильный ответ, но я хочу представителя. :)

# settings.py

ROBOTSTXT_OBEY = False

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...