爬虫实验笔记

        这里的爬虫实验害暂时没有遇到验证码等问题,步骤可以简单概括为:

1.找到爬虫必要的信息;

2.内容提取;

3.将提取到的内容保存至xlsx文件

1.找到爬虫必要的信息

        以zh为例,首先找一个自己感兴趣的贴,进入开发者模式,刷新,网络抓包:

        这个时候会看到一个feeds?的包,这就是页面的feeds接口,所有的回复都可以在这里看到

        点开它,可以在里面看到关于评论的所有信息,例如target下的content储存了评论,tarfer下的author下的name储存了层主的名字。

        当然,最重要的部分在于消息头:

         在消息头中找到accept-language、origin、referer、user-agent,这样才能够让机器人访问网页。

2.内容提取

        找到以上信息后,就开始写代码了:

        首先是请求头:

headers = {
    'accept-language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'origin': 'https://www.zhihu.com',
    'referer': 'https://www.zhihu.com/question/20744784',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0'
}

        然后是页面的feeds接口:

start_url='https://www.zhihu.com/api/v4/questions/20744784/feeds?include=data%5B*%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cattachment%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Cis_labeled%2Cpaid_info%2Cpaid_info_content%2Creaction_instruction%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_recognized%3Bdata%5B*%5D.mark_infos%5B*%5D.url%3Bdata%5B*%5D.author.follower_count%2Cvip_info%2Cbadge%5B*%5D.topics%3Bdata%5B*%5D.settings.table_of_content.enabled&offset=&limit=3&order=default&platform=desktop'

        然后进行内容的提取,但是要注意检测IP是否被限制,如果爬不到数据就说明可能被限制了。

response = requests.get(url, headers=headers)  # response即请求的反馈
    print(response)
    # 可以通过print输出response,若输出200则发送请求成功
    c = response.json() # 获取页面内容中的json数据
    # 判断data是否在获取的json数据中
    if "data" not in c:
        print("获取数据失败,本IP可能已被限制")
        break

    # 没有退出循环 说明data在c中
    datas = c.get('data')

        这一步提取到的是页面内容的所有json数据,要从中提取需要的数据,也就是第一部中找到的喜欢的标签下的内容。但是,因为正如第一步体现的,content中的数据并不全是text,所以需要使用PyQuery库,剔除HTML标签后提取回答内容中的文本。

  for d in datas:
        user = d.get("target").get("author").get("name")  # 回答者用户名
        print("用户名:" + user)
        users.append(user)  # 将用户名添加至自定义用户名列表

        answer = pq(d.get("target").get("content")).text()

        print("回答:"+answer)                       # 与用户名同理,输出所获取的内容文本
        answers.append(answer)                       # 将用户名添加至自定义用户名列表

        vote = d.get("target").get("voteup_count")                             # 赞同数
        print("赞同数:"+str(vote))                       # 同理,注意将vote转化成字符串
        votes.append(vote)                       # 将支持数添加至自定义支持数

        获取下一个链接,添加在自定义链接列表中,进行下一次循环:

next_url.append(c["paging"]["next"])  # 将next所指向的回答导入next_url中
    # 当不存在下一个链接时跳出循环
    if c["paging"]["is_end"]:
        break

3.内容存储

        这一步使用的是xlsxwriter库

filename = 'zhihu.xlsx'  # 要保存的文件名
    fileW = xlsxwriter.Workbook(filename)  # 写入filename
    tableWrite = fileW.add_worksheet('sheet1')  # 向这个文件增加表单sheet1
    # 把第一行的三个列名插入进去
    tableWrite.write(0, 0, '用户名')  # 第1行第1列
    tableWrite.write(0, 1,'内容')                          # 第1行第2列
    tableWrite.write(0, 2,'赞同数')                           # 第1行第3列
    # 遍历要合并的评论集,从第二行开始依次插入数据,i从0开始
    for i in range(len(users)):
        tableWrite.write(i + 1, 0, users[i])  # 第i+2行第1列
        tableWrite.write(i + 1, 1, answers[i])                             # 第i+2行第2列
        tableWrite.write(i + 1, 2, votes[i])                             # 第i+2行第3列
    fileW.close()

4.运行结果

        当然是成功获取到想要的数据拉

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜之王。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值