您的当前位置:首页正文

python爬取今日头条街拍美图

2024-11-27 来源:个人技术集锦

爬取街拍美图(注意:以下长文预警)

成品展示

下图是街拍美图保存到本地的电脑截图。

下图是程序运行时的截图。

需求分析

首先,打开头条的街拍页面,我在不断的往下滑动,页面一直有新的标签刷出来,不过页面的 url 斌并没有变化,所以我猜测这是通过ajax加载的。如下图所示。

上面,我画了三个圈,分别表示三种类型。第一种是点进去之后,必须得通过点击才能看到下一张图片;第二钟是点进去之后,直接往下滑动就可以看到全部的图片,第三种是视频,不在本篇博文的讨论范围。第一和第二种类型都是通过JavaScript加载的页面。

获取索引页

通过查看多个ajxa请求之后,发现只有offset是变化的,并且变化规律很明显。还有,keyword参数其实就是搜索的关键字。

def get_index_page(offset, keyword):
    params = {
   
        'offset': offset,
        'format': 'json',
        'keyword': keyword,
        'autoload': 'true',
        'count': '20',
        'cur_tab': '1',
        'from': 'search_tab',
        'pd': 'synthesis'
    }
    base_url = 'https://www.toutiao.com/api/search/content/?'
    url = base_url + urlencode(params)
    try:
        response = requests.get(url=url, headers=headers)
        if response.status_code == codes.ok:
            print(url + ':导航页请求成功!')
            return response.text
    except requests.ConnectionError:
        print('请求导航页失败!')
        return None

我把参数放在一个字典中,然后用urlencode函数封装属性。然后,拼接两个字符串。

解析索引页内容

分析ajax请求的返回结果,拿到详情页的url。在这里,我发现每个data里面的第一项里面都含有key为cell_type的键值对,而且这个选项没有url,所以这里有两行去除的语句。函数返回的是详情页的url列表。

def parse_index_page(html):
    data = json.loads(html)
    if data and 'data' in data.keys():
        for item in data.get('data'):
            if item.get('cell_type') is not None:  
                continue
            yield item.get('article_url')

根据索引页的url获取详情页

根据URL的链接,逐个请求详情页,并返回详情页的内容。

def get_detail_page(url):
    try:
        response = requests.get(url=url, headers=headers)
        if response.status_code == 200:
            print(url + ':详情页请求成功!')
            return response.text
        else:
            return None
    except RequestException:
        print('请求详情页错误', url)
        return None

解析详情页的内容

通过查看详情页返回的内容可以发现,详情页都是通过JavaScrip

显示全文