利用Ajax爬取今日头条------街拍图片

昨天利用Ajax爬取了微博首页,中间出现好多问题,但最终基本都解决了!有兴趣的可以去看看那篇文章,这篇博客主要讲如何利用requests模拟Ajax爬取今日头条中街拍的内容。

首先打开今日头条,输入街拍,找到我们所要的信息

 按照下图的方式寻找模拟Ajax请求所需要的信息

在写代码之前要明确我们的目标是什么------找到Ajax请求后服务器发送回来的json数据,这些数据在网页的network中都能看到:

知道信息和目标之后就可以写代码了 

直接上代码,在代码中理解各种参数

import requests
import json

def getHtml(url):
    try:

        ---------------------------请求头信息----------------------------------
        headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2864.400",
            "X-Requested-With":"XMLHttpRequest",
            "Referer":"https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D"
        }

        ------------------------get请求所带的参数-------------------------------
        params = {
            "aid":"24",
            "offset":"20",
            "format":"json",
            "keyword": "街拍",
            "autoload": "true",
            "count": "20",
            "cur_tab": "1",
            "from": "search_tab",
            "pd": "synthesis",
        }
        ---------------------------获取数据内容--------------------------------
        response = requests.get(url,headers = headers,params = params)
        response.raise_for_status()
        response.encoding = response.apparent_encoding
        return response.text
    except:
        return "爬起失败"

if __name__ == '__main__':

    url = "https://www.toutiao.com/api/search/content/?"
    page = getHtml(url)


    将爬取的内容转化为JSON数据,便于后续的提取小姐姐图片的URL
    print(json.loads(page))

结果如下:

最难的时候到了------清洗数据,找到我们所需要的东西

 教大家一种方法,也是我无意之间发现的,就是打开我们请求的数据的URL,在网页中查看,条理更加清晰!

比如说,我们这次爬取的地址是:https://www.toutiao.com/api/search/content/?aid=24&offset=0&format=json&keyword=街拍&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis

在网页中打开:

我们就来具体分析一下data中的数据:

找到我们所需要的内容后,就可以写代码了:

具体的代码如下:

import requests
import json


def getHtml(url):
    try:
        headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2864.400",
            "X-Requested-With":"XMLHttpRequest",
            "Referer":"https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D"
        }
        params = {
            "aid":"24",
            "offset":"0",
            "format":"json",
            "keyword": "街拍",
            "autoload": "true",
            "count": "20",
            "cur_tab": "1",
            "from": "search_tab",
            "pd": "synthesis",
        }
        response = requests.get(url,headers = headers,params = params)
        response.raise_for_status()
        response.encoding = response.apparent_encoding
        return response.text
    except:
        return "爬取失败"

if __name__ == '__main__':
    url = "https://www.toutiao.com/api/search/content/?"
    page = getHtml(url)
    data_json = json.loads(page)
    item = data_json.get("data")
    for i in item:
        imgs_list = i.get("image_list")
        title = i.get("title")
        -----data中并不是每一个数据都包含我们所需要的东西,所以加一个条件-------
        if not imgs_list:
            continue
        -------------------------------------------------------------------
        print(title)
        print(imgs_list)

 来看结果:

 这只是第一页中所包含的数据,我们只需要给加上一个循环,请求头中offset就是控制页面的,每页20个数据,也就是说0,20,40,60,80......,这样我们就能动态的爬取若干图片了!具体的循环我就不贴出来了,有兴趣的可以自己写一下!

最后,还是那句话,有兴趣的小伙伴可以一起交流!!!

猜你喜欢

转载自blog.csdn.net/yanzhiguo98/article/details/86663709