admin管理员组

文章数量:1660864

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/ )


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/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%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/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%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)

本文标签: 分页头条今日标题Python