Python---分页爬取今日头条标题

python分页爬取今日头条标题

要爬取的内容(分页爬取今日头条中77事件的所有文章标题)

在这里插入图片描述

爬取结果展示(只展示出了部分)

在这里插入图片描述

#工具:pycharm(什么编译器都可以)、谷歌浏览器

进入正文:

一、首先对需求进行分析:

1.打开谷歌浏览器,搜索今日头条,如下输入77事件搜索
在这里插入图片描述

2.鼠标右键浏览器,点击检查,进入开发者模式对数据进行分析
在这里插入图片描述
3.之后点击Network,选择XHR,会发现什么都没有,鼠标点到浏览器上方的地址栏,按回车进行刷新
在这里插入图片描述
4.刷新之后会发现只有一条数据,鼠标点击
在这里插入图片描述
5.我们这里只用Headers和Respone,Headers是浏览器请求的一些数据,Respone是后台返回的数据
在这里插入图片描述
6.第一步分析Headers; Request URL 是浏览器请求的url地址(一会写python代码用这个url请求),方式为get请求
在这里插入图片描述
7.鼠标滚轮向下翻找到Request Headers,会看到有user-agent ,cookie,这个有什么用呢?所有网站都会有反爬,这里user-agent写python代码会用到,用来伪装成谷歌浏览器访问后台,而cookie有时候有时候不写也能爬取到(爬取不到就再下面的python代码中加上)
在这里插入图片描述
8.第二步分析Response,这是一个json数据,ctrl+a全选,ctrl+c复制所有数据到json在线解析上(百度json解析,第一个就是,网址:http://www.bejson.com/
在这里插入图片描述
在这里插入图片描述
9.选择json在线编辑器
在这里插入图片描述
10第一步:ctrl+a,先把原来的数据删除掉,ctrl+v把上面第8步复制的数据粘贴过来,第二步:点击格式化json数据,第三步:点击将json数据对象化
在这里插入图片描述
11.分析json数据,经分析,会发现title(标题)都在data里,我们需要将json串转化成字典,之后根据键取出data的数据
在这里插入图片描述
12.要进行分页爬取,这个offset参数代表的就是页码
在这里插入图片描述
13.鼠标滚轮向下滚,会发现offset以20递增,由此可见一共8页
在这里插入图片描述

二、进行python代码解析

1.导入json包,requests包;json直接就可以导入,requests需要下载;点击file—setting
在这里插入图片描述
选择Project:
在这里插入图片描述
右边点击加号
在这里插入图片描述
先搜索requests包,点击安装
在这里插入图片描述
2.python正式开始爬取,先导入这两个包

import requests
import json

3.写个主函数,手动输入起始页和终止页,并调用一个page函数

if __name__ == '__main__':
    startPage = int(input("请输入起始页码"))
    endPage = int(input("请输入终止页码"))
    page(startPage,endPage)

4.page函数接收起始页和终止页,for循环页码,url是上面分析的url,要将offset={}用来拼接页码(i就是页码,但是得*20,因为每增加一页是以offset=20递增的),调用loadPage(url),把url传过去,返回个布尔值(返回False代表读取完所有页了,终止当前函数)

def page(startPage, endPage):
    for i in range(startPage-1, endPage):
        print("当前第%s页" % (i+1))
        url="https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset={}&format=json&keyword=77%E4%BA%8B%E5%8F%98&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp=1562467283218".format(i*20)
        isPage=loadPage(url)
        if isPage==False:
            return

5.loadPage(url)接收url,设置个字典形式的请求头headers,用来伪装浏览器,

将上面分析到的user-agent和cookie复制到里面

def loadPage(url):
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
        "cookie":"tt_webid=6710713392061285902; WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6710713392061285902; UM_distinctid=16bc9db8a29f6-0417349b599406-516d3e71-13c680-16bc9db8a2d85; csrftoken=5eb2a0e00bcbb888f417ef261ee5269a; CNZZDATA1259612802=1761938442-1562456487-https%253A%252F%252Fwww.baidu.com%252F%7C1562461887; s_v_web_id=ddb620b1224506f21ba99de20d4169e3; __tasessionId=ned4t635k1562467258609"
    }
    #try异常,为什么出现异常?当所有也访问完,data为空,会出'NoneType' object is not iterable异常
    try:
        #将url和headers绑定发送请求,.text是拿到json串
        data = requests.get(url, headers=headers).text
        #将json传化成字典
        news = json.loads(data)
        #遍历字典的data数据
        for new in news["data"]:
            #如果有title,就输出
            if "title" in new.keys():
                print(new["title"])
    except Exception as e:
        print(e)
        #返回false就代表所有也已经读取完了
        return False
    return True

总结:篇幅过长,如果跟着我这个做不出来,或者不懂,留言问我,我有时间B站直播教学。

所有代码:

import requests
import json


def page(startPage, endPage):
    for i in range(startPage-1, endPage):
        print("当前第%s页" % (i+1))
        url="https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset={}&format=json&keyword=77%E4%BA%8B%E5%8F%98&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp=1562467283218".format(i*20)
        isPage=loadPage(url)
        if isPage==False:
            return

def loadPage(url):
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
        "cookie":"tt_webid=6710713392061285902; WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6710713392061285902; UM_distinctid=16bc9db8a29f6-0417349b599406-516d3e71-13c680-16bc9db8a2d85; csrftoken=5eb2a0e00bcbb888f417ef261ee5269a; CNZZDATA1259612802=1761938442-1562456487-https%253A%252F%252Fwww.baidu.com%252F%7C1562461887; s_v_web_id=ddb620b1224506f21ba99de20d4169e3; __tasessionId=ned4t635k1562467258609"
    }
    try:
        data = requests.get(url, headers=headers).text
        news = json.loads(data)
        for new in news["data"]:
            if "title" in new.keys():
                print(new["title"])
    except Exception as e:
        print(e)
        return False
    return True

if __name__ == '__main__':
    startPage = int(input("请输入起始页码"))
    endPage = int(input("请输入终止页码"))
    page(startPage,endPage)

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值