Scrapy无法返回特定标记的结果

时间:2019-01-15 17:35:36

标签: python xpath web-scraping scrapy web-crawler

我今天才刚开始使用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可以完成工作,开始搜索并发现scrapy,该文档对我来说是完美的。 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 HashtagsTop User Mentions表;

它们的Xpath无效,css选择器也无效;我不知道为什么。

1 个答案:

答案 0 :(得分:2)

页面加载时会发出AJAX请求。

如果在加载页面时打开Web检查器,则会看到如下所示的AJAX请求:

enter image description here

如果您按ctrl + f在页面源代码中此请求中使用的某些ID,您将看到一些javascript,如:

enter image description here

您可以使用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