Scrapy не возвращает результаты для определенных тегов - PullRequest
0 голосов
/ 15 января 2019

Я только начал использовать Scrapy сегодня, но у меня есть опыт программирования на javascript, поэтому, пожалуйста, потерпите меня, я дам очень подробное объяснение:

Я использую GramReport для анализа некоторых профилей Instagram (Извлечь количество подписчиков, Количество постов и другие данные.), Так как у меня есть список различных профилей, я хотел автоматизировать эту задачу;

Окончательная идея будет такой:

1. Use Scrapy to crawl a specific profile ( so append 'profile' to 'gramreport.com/user/' )
2. Extract specific data and save it in a csv

Я думал, что Python сделает работу, начал поиск и нашел пустяки, документация была для меня идеальной https://doc.scrapy.org/en/latest/intro/tutorial.html

Я решил попробовать, как в учебнике, я создал паука:

import scrapy
class QuotesSpider(scrapy.Spider):
name = "profile"
start_urls = [
    'http://gramreport.com/user/cats.gato'
]

def parse(self, response):
    page = response.url.split("/")[-1]
    filename = 'profile-%s.html' % page
    with open(filename, 'wb') as f:
        f.write(response.body)

так scrapy crawl profile Работает отлично, я не могу получить HTML-страницу. Далее я пытаюсь использовать оболочку:

scrapy shell 'http://gramreport.com/user/cats.gato'

Отлично, я могу получить некоторые данные через Xpath или CSS:

//Followers:
response.xpath('/html/body/div[3]/table[1]/tr/td[2]/table/tr[1]/td/div/table/tr[2]/td/text()').extract()

//Posts:
response.xpath('/html/body/div[3]/table[1]/tr/td[2]/table/tr[3]/td/div/table/tr[2]/td/text()').extract()

//Page Name:
response.xpath('/html/body/div[3]/table[1]/tr/td[1]/div/div/div/span[2]/text()').extract()

//Average Likes:
response.xpath('/html/body/div[3]/div[1]/div/div/div[1]/div/text()').extract()

//Average Comments:
response.xpath('/html/body/div[3]/div[1]/div/div/div[2]/div/text()').extract()

У большинства результатов, которые я получаю, есть символ u 'и другие регулярные выражения, такие как [u'\n\t\t\t252,124\t\t'], но я думаю, что для этого уже есть ответы.

Но есть некоторые данные, которые я не могу извлечь, я просто ничего не получаю;

Первая из них - таблица Recent Interactions, это происходит из-за AJAX, но я просто не могу понять, как это исправить; Может быть, используя задержку?

Вторая таблица Top Hashtags и Top User Mentions;

Их Xpath не работают, как и селектор css; Я не могу понять, почему.

1 Ответ

0 голосов
/ 16 января 2019

При загрузке страницы выполняется запрос AJAX.

Если вы откроете веб-инспектор при загрузке страницы, вы увидите запрос AJAX, подобный этому:

enter image description here

Если вы нажмете ctrl + f на некоторые идентификаторы, используемые в этом запросе в исходном коде страницы, вы увидите такой код JavaScript, как:

enter image description here

Вы можете найти этот URL с помощью scrapy и просто отправить запрос:

def parse(self, response):

    script = response.xpath("//script[contains(text(), 'getresultsb']")
    url = script.re('url:"(.+?)"')  # capture between ""
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest',
    }
    yield Request(url, 
        method='POST', 
        body='dmn=ok', 
        callback=self.parse_recent
        headers=headers,
    )

def parse_recent(self, response):
    # parse recent data here
...