把自家发过的今日头条爬取下来

以天涯论坛为例,接下去用Python来模拟这一个Ajax央求,把自个儿发过的新浪爬取下来。

1. 解析必要

开荒Ajax的XH凯雷德过滤器,然后间接滑动页面以加载新的天涯论坛内容。能够看看,会随地有Ajax伏乞发出。

选定在那之中一个央求,深入分析它的参数新闻。点击该诉求,步向详情页面,如图6-11所示。

图片 1

能够开采,那是四个GET类型的倡议,央浼链接为[

继之再看看别的央求,能够开掘,它们的typevaluecontainerid同心同德。type始终为uidvalue的值正是页面链接中的数字,其实那正是顾客的id。另外,还有containerid。可以发掘,它便是107603加多客户id。改造的值便是page,很显著那一个参数是用来调控分页的,page=1代表首先页,page=2表示第二页,由此及彼。

2. 深入分析响应

随之,观望那个央求的响应内容,如图6-12所示。

图片 2

其豆蔻梢头剧情是JSON格式的,浏览器开辟者工具自动做了剖判以方便大家查阅。能够看看,最重大的两某个消息正是cardlistInfocards:前者带有多个拾壹分首要的音讯total,观望后方可窥见,它实际上是新浪的总的数量据,大家能够依照这几个数字来估算分页数;前者则是三个列表,它满含11个因素,展开内部二个看一下,如图所示。

图片 3

能够开掘,这一个因素有一个相比较根本的字段mblog。伸开它,能够发现它含有的难为和讯的某个音信,举个例子attitudes_count(赞数目)、comments_count(商酌数目)、reposts_count(转载数量)、created_at(发表时间)、text(微博正文)等,况且它们都以部分格式化的剧情。

如此那般大家恳请二个接口,就可以收获10条博客园,而且诉求时只必要转移page参数就可以。

这样的话,大家只要求简单做多少个周而复始,就足以获取具备博客园了。

3. 实战演习

此地大家用程序模拟这一个Ajax哀告,将自己的前10页天涯论坛全部爬取下来。

第意气风发,定义一个措施来拿到每趟恳求的结果。在呼吁时,page是八个可变参数,所以大家将它作为艺术的参数字传送递进来,相关代码如下:

from urllib.parse import urlencode
import requests
base_url = 'https://m.weibo.cn/api/container/getIndex?'

headers = {
    'Host': 'm.weibo.cn',
    'Referer': 'https://m.weibo.cn/u/2830678474',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}

def get_page(page):
    params = {
        'type': 'uid',
        'value': '2830678474',
        'containerid': '1076032830678474',
        'page': page
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('Error', e.args)

先是,这里定义了base_url来代表诉求的U宝马7系L的前半局地。接下来,结构参数字典,在那之中typevaluecontainerid是原则性参数,page是可变参数。接下来,调用urlencode()措施将参数转变为UQashqaiL的GET央求参数,即相仿于type=uid&value=2830678474&containerid=1076032830678474&page=2这么的款型。随后,base_url与参数拼合产生二个新的U奇骏L。接着,大家用requests央求那个链接,参预headers参数。然后决断响应的状态码,若是是200,则直接调用json()方式将内容解析为JSON再次回到,不然不回来任何音信。借使现身非凡,则捕获并出口其极其音讯。

继之,大家须要定义多个深入分析方法,用来从结果中提取想要的消息,举个例子此次想保留博客园的id、正文、赞数、研究数和转载数那多少个内容,那么能够先遍历cards,然后拿走mblog中的各种消息,赋值为二个新的字典再次回到就能够:

from pyquery import PyQuery as pq

def parse_page(json):
    if json:
        items = json.get('data').get('cards')
        for item in items:
            item = item.get('mblog')
            weibo = {}
            weibo['id'] = item.get('id')
            weibo['text'] = pq(item.get('text')).text()
            weibo['attitudes'] = item.get('attitudes_count')
            weibo['comments'] = item.get('comments_count')
            weibo['reposts'] = item.get('reposts_count')
            yield weibo

此处大家赖以pyquery将正文中的HTML标签去掉。

末尾,遍历一下page,黄金时代共10页,将领到到的结果打字与印刷输出就可以:

if __name__ == '__main__':
    for page in range(1, 11):
        json = get_page(page)
        results = parse_page(json)
        for result in results:
            print(result)

别的,大家还能加多个方式将结果保存到MongoDB数据库:

from pymongo import MongoClient

client = MongoClient()
db = client['weibo']
collection = db['weibo']

def save_to_mongo(result):
    if collection.insert(result):
        print('Saved to Mongo')

如此有着功效就兑现有功了。运路程序后,样例输出结果如下:

{'id': '4134879836735238', 'text': '惊不惊喜,刺不刺激,意不意外,感不感动', 'attitudes': 3, 'comments': 1, 'reposts': 0}
Saved to Mongo
{'id': '4143853554221385', 'text': '曾经梦想仗剑走天涯,后来过安检给收走了。分享单曲 远走高飞', 'attitudes': 5, 'comments': 1, 'reposts': 0}
Saved to Mongo

查阅一下MongoDB,相应的数目也被封存到MongoDB,如图所示。

图片 4

诸有此类,大家就顺手经过深入分析Ajax并编辑爬虫爬取下来了腾讯网列表,最终,给出本节的代码地址:。

本节的指标是为了演示Ajax的模仿央求进度,爬取的结果不是重要。该程序仍然有比超级多足以圆满的地点,如页码的动态总括、知乎查看全文等,若感兴趣,能够尝尝一下。

通过这几个实例,我们任重(Ren Zhong卡塔尔国而道远学会了如何去剖判Ajax恳求,怎么样用程序来效仿抓取Ajax要求。掌握了抓取原理之后,下后生可畏节的Ajax实战练习会特别贯虱穿杨。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website