初识爬虫(番外篇-python)

浪子不回头ぞ 提交于 2020-01-07 15:45:09

最近因为一些特殊原因,了解了一下python,并且做了一个简易爬虫,目标是知乎。

注*:博主并没有深入学习python,只是了解了一下基本用法,如变量类型、循环、判断,然后使用了一下python的工具,博主对这些工具也不太了解,博主的代码仅限于实现功能,如有关于python的问题,请不要问博主。博主的python版本是2.7。

代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import codecs
import requests
import csv
import sys
import json
import time, datetime
#更改str基础编码为utf-8
reload(sys)
sys.setdefaultencoding('utf-8')

def getdata(cookie,page,search,search_hash_id):
    url = 'https://www.zhihu.com/api/v4/search_v3?t=general&q=' + str(
        search) + '&correction=1&offset=' + str(
        page) + '&limit=20&lc_idx=23&show_all_topics=0&search_hash_id=' + str(
        search_hash_id) + '&vertical_info=0%2C1%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C1'
    #原链接
    # url = 'https://www.zhihu.com/api/v4/search_v3?t=general&q=996&correction=1&offset=60&limit=20&lc_idx=63&show_all_topics=0&search_hash_id=12310cc00bec8e490920f7b13a16fb58&vertical_info=0%2C1%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C1'
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36",
        "cookie": cookie,
        "Host": "www.zhihu.com",
        "Referer": "https://www.zhihu.com/",
    }

    res = requests.get(url, headers=headers)
    #json转字典
    result = json.loads(res.text)
    #主要数据
    data = result['data']
    return data

def savedata(cookie,page,search,filename,search_hash_id):
    index = 1
    data = []
    #循环拼接分页数据
    while index <= page:
        data += getdata(cookie, index*20, search,search_hash_id)
        index = index + 1

    with open(filename, 'wb') as f:
        f.write(codecs.BOM_UTF8)
        writer = csv.writer(f)
        #表头
        fields = ('标题', '描述', '点赞', '评论', '创建时间')
        encoding = 'utf-8-sig'
        writer.writerow(fields)

        for key in data:
            #忽略错误
            try:
                title = str(key['highlight']['title'])
                description = str(key['highlight']['description'])
                voteup = str(key['object']['voteup_count'])
                comment = str(key['object']['comment_count'])
                time_str = float(key['object']['created_time'])
                #时间戳转时间
                timeArray = time.localtime(time_str)
                create_time = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
                # print('标题:'+title)
                # print('描述:'+description)
                # print('点赞:'+voteup)
                # print('评论:'+comment)
                # print('创建时间:'+create_time)

                row = []
                row.append(title)
                row.append(description)
                row.append(voteup)
                row.append(comment)
                row.append(create_time+'\t')
                writer.writerow(row)
            except:
                print("发生异常")

if __name__ == '__main__':
    #cookie 重要参数 cookie与search_hash_id会发生改变,即时到知乎网页请求获取最新参数
    cookie = '写入你的cookie'
    page = 10    #获取多少页数据 知乎默认一页20条数据
    search = '996'    #搜索内容
    filename = '996.csv'    #保存的文件名 保存到本文件同目录下
    search_hash_id = 'bcdfc2c7b22a17917dd6d6aa6752b3a4'     #知乎搜索id 重要参数
    savedata(cookie,page,search,filename,search_hash_id)

工具:

PyCharm、Anaconda2

具体安装方法:https://www.cnblogs.com/yuxuefeng/articles/9235431.html 这篇博客讲的很清楚,其中要注意python要用到很多工具,自己安装很费事,而Anaconda带有很多工具,不需要自己再安装,但是一定要将解释器选择为Anaconda中的python,不然是无法利用到Anaconda的。

效果:

 

 注意:

本博客的代码只能爬到这种数据:

 

 不能爬到这种数据:

 

 因为数据格式不同,也不能说不能爬到,采集是可以采集到的,但是导出的时候都被当做异常数据处理到了。这已经满足博主想要的效果了,如有需要可以自行修改。

 

最后,如果你只是想要数据,并不想写代码,推荐:http://houyi.shenjian.io/?bd&utm=search 这个工具,博主简单用了一下,功能还行,而且是免费的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!