知乎爬虫之爬取专栏信息

接着昨天的模拟登陆,今天来爬取一下专栏信息
我们将对专栏https://zhuanlan.zhihu.com/Entertainmentlaw进行抓取
首先还是进行抓包分析,可以发现这里有我们想要的专栏的名称,作者,关注人数等信息
知乎爬虫之爬取专栏信息_第1张图片
然后我们看一下消息头,看一下请求的URL和请求头
知乎爬虫之爬取专栏信息_第2张图片
然后就可以编写代码了

# -*- coding:utf-8 -*-
__author__="weikairen"

import  requests
from bs4 import  BeautifulSoup
import  time

BASE_URL='https://www.zhihu.com/'
LOGIN_URL=BASE_URL+'login/phone_num'
CAPTCHA_URL=BASE_URL+'captcha.gif?r='+str(int(time.time())*1000)+'&type=login'

BLOGS_BASE_URL='https://zhuanlan.zhihu.com/Entertainmentlaw'
BLOGS_API_URL='https://zhuanlan.zhihu.com/api/columns/Entertainmentlaw'

session = requests.session()    #session创建为全局变量是为了能在不同的函数中使用一个相同的session
#在登录过后 session会保存服务器返回的cookie,爬取专栏信息的时候用这个session,服务器就会认为你已经登录,就不会拒绝你的请求了

def login():
    headers={
        'host':'www.zhihu.com',
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0',
        'referer':"https://www.zhihu.com/",
        'X - Requested - With': "XMLHttpRequest"
    }                                                      #构造请求头,讲它伪装成为浏览器
    captcha_content=requests.get(CAPTCHA_URL,headers=headers).content
    with open('C:\cap.gif','wb') as cap:              #将验证码图片下载下来存储到C盘的根目录下面
        cap.write(captcha_content)
    captcha=input('请输入验证码: ')
    data={
        '_xsrf': "94b6a3f4ba711971716bd8b863d9c91c",
        'password': "******",
        'captcha_type': "cn",
        'remember_me': "true",
        'phone_num': "********"
    }

    response=session.post(LOGIN_URL,data=data,headers=headers)
    print(response.json()['msg'])

def blogs():
    headers = {
        'host': "zhuanlan.zhihu.com",
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0',
        'referer': "https://zhuanlan.zhihu.com/Entertainmentlaw"
    }
    #session.headers.update(headers)
    response = session.get(BLOGS_API_URL,headers=headers).json()

    print(response)
    print('专栏名称:'+response['name'])
    print('专栏介绍:' + response['intro'])
    print('专栏作者:' + response['creator']['name'])
    print('专栏作者主页:' + response['creator']['profileUrl'])
    print('专栏关注人数:' + str(response['followersCount']))

login()
blogs()

运行就可以看见结果了
知乎爬虫之爬取专栏信息_第3张图片

当然,我们可以更加完善一点,吧文章信息也爬取出来
说一下文章信息的URL,知乎一次只会加载20篇文章,请求的URL构造是https://zhuanlan.zhihu.com/api/columns/Entertainmentlaw/posts?limit=20&offset=0 ,
https://zhuanlan.zhihu.com/api/columns/Entertainmentlaw/posts?limit=20&offset=20
你能发现规律吗?limit是知乎规定的,表示一次请求20篇文章,offset表示这次请求文章的起始地址

好的,下面我们看一下代码,代码中带有注释

# -*- coding:utf-8 -*-
__author__="weikairen"

import  requests
from bs4 import  BeautifulSoup
import  time

BASE_URL='https://www.zhihu.com/'
LOGIN_URL=BASE_URL+'login/phone_num'
CAPTCHA_URL=BASE_URL+'captcha.gif?r='+str(int(time.time())*1000)+'&type=login'

BLOGS_BASE_URL='https://zhuanlan.zhihu.com/Entertainmentlaw'            #专栏地址
BLOGS_API_URL='https://zhuanlan.zhihu.com/api/columns/Entertainmentlaw' #专栏信息地址,如关注数
BLOGS_URL='https://zhuanlan.zhihu.com/api/columns/Entertainmentlaw/posts?limit=20&offset='#专栏文章的请求构造地址

session = requests.session()    #session创建为全局变量是为了能在不同的函数中使用一个相同的session
#在登录过后 session会保存服务器返回的cookie,爬取专栏信息的时候用这个session,服务器就会认为你已经登录,就不会拒绝你的请求了

def login():
    headers={
        'host':'www.zhihu.com',
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0',
        'referer':"https://www.zhihu.com/",
        'X - Requested - With': "XMLHttpRequest"
    }                                                      #构造请求头,讲它伪装成为浏览器
    captcha_content=requests.get(CAPTCHA_URL,headers=headers).content
    with open('C:\cap.gif','wb') as cap:              #将验证码图片下载下来存储到C盘的根目录下面
        cap.write(captcha_content)
    captcha=input('请输入验证码: ')
    data={
        '_xsrf': "94b6a3f4ba711971716bd8b863d9c91c",
        'password': "********",
        'captcha_type': "cn",
        'remember_me': "true",
        'phone_num': "********"
    }

    response=session.post(LOGIN_URL,data=data,headers=headers)
    print(response.json()['msg'])

def blogs():
    headers = {
        'host': "zhuanlan.zhihu.com",
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0',
        'referer': "https://zhuanlan.zhihu.com/Entertainmentlaw"
    }
    #session.headers.update(headers)
    response = session.get(BLOGS_API_URL,headers=headers).json()

    print(response)
    print('专栏名称:'+response['name'])
    print('专栏介绍:' + response['intro'])
    print('专栏作者:' + response['creator']['name'])
    print('专栏作者主页:' + response['creator']['profileUrl'])
    print('专栏关注人数:' + str(response['followersCount']))

    blogIndex=0
    end=0
    while not (end):
        response=session.get(BLOGS_URL+str(blogIndex),headers=headers).json()
        for blog in response:
            #print('文章序号:'+str(blogId))
            print('文章名称:'+blog['title'])
            print('文章作者:' + blog['author']['name'])
            print('发送时间:' + blog['publishedTime'])
            print('文章链接:' +BLOGS_BASE_URL+ blog['url'])

        if len(response)<20:
            end=1

        blogIndex += 20



login()
blogs()

结果如下:
知乎爬虫之爬取专栏信息_第4张图片

每天进步一点点

你可能感兴趣的:(python爬虫)