爬虫总结1——爬取异步请求(XHR/JS)数据方法

在爬取到http://icloudy.cechina.cn/网页的时候,发现点击“加载更多”会出现新的内容,但是网页却没有发生变化,于是打开F12查看Network发现,会每次点击都会多出来一行,如下:

随便点开一个就可以看到我们真正访问的URL地址:

从这里我们就可以清楚的在xhr返回的header里面看到异步请求的url,这里我们直接访问该url(或者在preview里面可以看到返回的数据)可以看到返回的数据就是新闻数据,也就是我们要爬的数据。接下来就是进行url格式分析,一般都会有规律可循。具体代码如下:

from pyspider.libs.base_handler import *


class Handler(BaseHandler):
    crawl_config = {
    }
    
    
    @config(fetch_type="js")
    @every(minutes=24 * 60)
    def on_start(self):
        for i in range(1,8):
            self.crawl('http://icloudy.cechina.cn/api/LoadArticleHandler.ashx?pageIndex=' + str(i) + '&pageSize=12&siteId=7', callback=self.index_page)         


    @config(fetch_type="js")     #代码中加入这行可以解决动态js封装数据的情况
    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        data = response.text.split(',')
        url = []
        for i in range(1,len(data)):
            if data[i][:5] == '"Url"':
                a = 'http://icloudy.cechina.cn' + data[i].split('"')[-2]
                url.append(a)
        for i in url:
            self.crawl(i, callback=self.detail_page)
            
    @config(fetch_type="js")
    @config(priority=2)
    def detail_page(self, response):
        if response.doc('#detail3-2').text() == '':
            neirong = response.doc('.article-content > p').text()
        else:
            neirong = response.doc('#detail3-2').text()
        return {
            "url": response.url,
            "title": response.doc('.conDe > h3').text(),
            "content": neirong,
            "time": response.doc('.from > span').text().split(' ')[1],
            "tab": '工业云',                                    
        }

我这里使用的是通过切片提取出所需要的ID并合并成每篇新闻正确的url地址,这种方法比较简单,也比较繁琐,主要是因为我确实不太熟悉正则表达式,不知道该如何进行匹配。有大佬希望可以提出指正意见!

猜你喜欢

转载自blog.csdn.net/muumian123/article/details/81746855