Web Scraping - Статьи McKinsey - PullRequest
       11

Web Scraping - Статьи McKinsey

0 голосов
/ 13 февраля 2019

Я хочу почистить заголовки статей.Я не могу понять, как извлечь текст заголовка.Можете ли вы взглянуть на мой код ниже и предложить решения.

Я новичок в области терапии.Я признателен за помощь!

Снимок экрана веб-страницы, представленной разработчиком https://imgur.com/a/O1lLquY

import scrapy



class BrickSetSpider(scrapy.Spider):
    name = "brickset_spider"
    start_urls = ['https://www.mckinsey.com/search?q=Agile&start=1']

    def parse(self, response):
        for quote in response.css('div.text-wrapper'):
            item = {
                'text': quote.css('h3.headline::text').extract(),
            }
            print(item)
            yield item

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

, если вы просто хотите выбрать текст тега h1, все, что вам нужно сделать, это:

[tag.css('::text').extract_first(default='') for tag in response.css('.attr')]

Использование xpath может быть проще.

 //h1[@class='state']/text()

Кроме того, я бы порекомендовал проверить BeautifulSoup для Python.Это очень просто и эффективно при чтении всей HTML страницы и извлечении текста.https://www.crummy.com/software/BeautifulSoup/bs4/doc/

Очень простой пример будет таким:

from bs4 import BeautifulSoup

text = '''
<td><a href="http://www.fakewebsite.com">Please can you strip me?</a>
<br/><a href="http://www.fakewebsite.com">I am waiting....</a>
</td>
'''
soup = BeautifulSoup(text)

print(soup.get_text())
0 голосов
/ 13 февраля 2019

Выглядит хорошо для новичка в разработке!Я изменил только селектор в вас parse функция:

for quote in response.css('div.block-list div.item'):
    yield {
        'text': quote.css('h3.headline::text').get(),
    }

UPD: хм, похоже, ваш сайт делает дополнительный запрос данных.

Откройте инструменты разработчика и проверьте запрос на https://www.mckinsey.com/services/ContentAPI/SearchAPI.svc/search с параметрами {"q":"Agile","page":1,"app":"","sort":"default","ignoreSpellSuggestion":false}.Вы можете сделать scrapy.Request с этими параметрами и соответствующими заголовками и получить JSON с данными.Он будет легко проанализирован с помощью json lib.

UPD2: как я вижу из этого скручивания curl 'https://www.mckinsey.com/services/ContentAPI/SearchAPI.svc/search' -H 'content-type: application/json' --data-binary '{"q":"Agile","page”:1,”app":"","sort":"default","ignoreSpellSuggestion":false}' --compressed, нам нужно сделать запрос следующим образом:

from scrapy import Request
import json

data = {"q": "Agile", "page": 1, "app": "", "sort": "default", "ignoreSpellSuggestion": False}
headers = {"content-type": "application/json"}
url = "https://www.mckinsey.com/services/ContentAPI/SearchAPI.svc/search"
yield Request(url, headers=headers, body=json.dumps(data), callback=self.parse_api)

, а затемв parse_api функция просто разобрать ответ:

def parse_api(self, response):
    data = json.loads(response.body)
    # and then extract what you need

Таким образом, вы можете перебрать параметр page в запросе и получить все страницы.

UPD3: Рабочее решение:

from scrapy import Spider, Request
import json


class BrickSetSpider(Spider):
    name = "brickset_spider"

    data = {"q": "Agile", "page": 1, "app": "", "sort": "default", "ignoreSpellSuggestion": False}
    headers = {"content-type": "application/json"}
    url = "https://www.mckinsey.com/services/ContentAPI/SearchAPI.svc/search"

    def start_requests(self):
        yield Request(self.url, headers=self.headers, method='POST',
                  body=json.dumps(self.data), meta={'page': 1})

    def parse(self, response):
        data = json.loads(response.body)
        results = data.get('data', {}).get('results')
        if not results:
            return

        for row in results:
            yield {'title': row.get('title')}

        page = response.meta['page'] + 1
        self.data['page'] = page
        yield Request(self.url, headers=self.headers, method='POST', body=json.dumps(self.data), meta={'page': page})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...