用requests实现简单爬虫 内涵社区段子 (需要去重)

# 这个网站内容段子很多都是重复的,第一次没去重获取到的大多数都重复,我以为代码有错,后来用集合去重后保存全部内容,发现保存到的不重复的段子和最初抓取到的全部段子的条数差距很多!

import requests

import re
import json



class Neihan:
    def __init__(self):
        self.start_url = "http://neihanshequ.com/"
        self.next_url_temp = "http://neihanshequ.com/joke/?is_json=1&app_name=neihanshequ_web&max_time={}"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}
        # 存储所有获取到的内容列表
        self.c_list = []
        
    def parse_url(self, url):  # 发送请求,获取htmlstr
        print(url)
        response = requests.get(url, headers=self.headers)
        return response.content.decode()


    def get_frist_page_content_list(self, html_str):  # 提取数据,提取max_time
        content_list = re.findall("<h1 class=\"title\">.*?<p>(.*?)</p>", html_str, re.S)
        max_time = re.findall("max_time: '(.*?)',", html_str)[0]
        return content_list, max_time


    def save_content_list(self, content_list):  # 保存前先遍历每页内容,并且添加到c_list里
        for content in content_list:
            self.c_list.append(content)


    # 保存用set集合去重后的内容
    def save_new_content_list(self):
        with open("neihan.txt","a",encoding="utf-8") as f:
            for content in set(self.c_list):
                f.write(content)
                f.write("\n")
            print(len(set(self.c_list)))


    def get_content_list(self, json_str):  # 提取第二页开始的每一页的数据
        dict_ret = json.loads(json_str)
        data = dict_ret["data"]["data"]
        content_list = [i["group"]["content"] for i in data]
        max_time = dict_ret["data"]["max_time"]
        has_more = dict_ret["data"]["has_more"]
        return content_list, max_time, has_more


    def run(self):  # 实现主要逻辑
        # 1.start_url
        # 2.发送请求,获取htmlstr
        html_str = self.parse_url(self.start_url)
        # 3.提取数据,提取max_time
        content_list, max_time = self.get_frist_page_content_list(html_str)
        # 4.保存数据
        self.save_content_list(content_list)
        # self.save_new_content_list()
        # 5.构造下一页的url地址
        i = 1  # 给定一个has_more,假设有第二页
        while i<20:
            next_url = self.next_url_temp.format(max_time)
            # 6.发送请求,获取json数据
            json_str = self.parse_url(next_url)
            # 7.提取数据
            content_list, max_time, has_more = self.get_content_list(json_str)
            # 8.保存,进入循环5-8步
            self.save_content_list(content_list)
            i += 1
        # 最后保存去重后的内容
        self.save_new_content_list()


if __name__ == '__main__':
    neihan = Neihan()
    neihan.run()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值