使用scrapy python加载更多请求

时间:2016-07-15 06:15:29

标签: python web-scraping scrapy scrapy-spider

我正在尝试使用scrapy刮取一个网站,我的蜘蛛如下:

class AngelSpider(Spider):


    name = "angel"
    allowed_domains = ["angel.co"]

    start_urls = (

        "https://angel.co/companies?locations[]=India",


    )
    def start_requests(self):
        page_size = 25
        headers ={

        'Host': 'angel.co',
        'Origin': 'https://angel.co',
        'User-Agent': 'Scrapy spider',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Accept':   '*/*',
        'X-Requested-With': 'XMLHttpRequest',
        'Referer': 'https://angel.co/companies?locations[]=India',

        'Accept-Language': 'en-US',
        }



        for offset in (0, 200, page_size):
            yield Request('https://angel.co/company_filters/search_data',
                          method='POST',
                          headers=headers,
                          body=urllib.urlencode(
                              {'action': 'more',
                               'filter_data[locations][]':'India',
                                 'sort':'signal',
                                 'page':2}))




    def parse(self, response):
        nestd =[]
        company = {}
        val = response.xpath('//div[@data-_tn = "companies/trending/row" ]')
        company_name = response.xpath("//div[@data-_tn = 'companies/trending/row' ]//div//div//div//div[@class='name']//text()").extract()
        #company_link = val.xpath("//div//div//div[@class ='photo']//@href").extract()
        #company_tag_line =val.xpath("//div//div//div//div//div[@class='pitch u-colorGray6']//text()").extract()
        #company_from = val.xpath("//div//div//div//div//a[@name]//text()").extract()
        print company_name

但它没有产生任何数据。是否有另一种方法可以模拟加载更多文章按钮来加载文章并继续刮刀?

2 个答案:

答案 0 :(得分:0)

从我看到的情况来看,该网站首先向https://angel.co/company_filters/search_data发出POST请求,该请求返回包含启动ID的JSON数据,如下所示:

{
    "ids": [
        146538,277273,562440,67592,124939,...,460951
    ],
    "total": 18443,
    "page": 2,
    "sort": "signal",
    "new": false,
    "hexdigest": "a8ef7331cba6a01e5d2fc8f5cc3e04b69871f62f"
}

之后,网站向https://angel.co/companies/startups发出GET请求,并将上述JSON中的值作为网址参数传递。

因此,start_requests中生成的请求应该由另一个回调处理,该回调应该读取作为响应返回的JSON数据并构建URL以获取HTML格式的实际启动列表。

答案 1 :(得分:-1)

您尝试废弃的网站使用javascript,您必须使用SeleniumScrapy-splash来模拟浏览器。