requests爬取知乎话题和子话题-程序员宅基地

技术标签: python  json  

zhihu.py

# *_*coding:utf-8 *_*
import pymysql
import requests
from lxml import etree

from requests_test.child_topic import GetChildTopic
from requests_test.parent_topic import GetParentTopic

if __name__ == "__main__":
    parent = GetParentTopic()
    res = parent.get_parent_data()
    # child  = GetChildTopic()
    # child.get_child_data(1027,2)
    child = GetChildTopic()
    for i in res:
        print("parent_id:",i)
        child.get_child_data(i,50)

  

parent_topic.py
# *_*coding:utf-8 *_*
import pymysql
from lxml import etree

import requests

class GetParentTopic(object):
    def __init__(self):
        self.conn = pymysql.connect(host='192.168.33.10', user='root', passwd='root', db='spider', charset='utf8')
        self.cur = self.conn.cursor()

    def get_parent_data(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
        }
        url = 'https://www.zhihu.com/topics'

        response = requests.get(url, headers=headers)
        res = response.text

        html = etree.HTML(res)
        ul = html.xpath("//ul[@class='zm-topic-cat-main clearfix']/li");

        parent_topic = {}

        for li in ul:
            title = li.xpath('./a/text()')[0];
            topic_id = li.xpath('./@data-id')[0];
            parent_topic[topic_id] = title
            import time

            # 格式化成2016-03-20 11:45:39形式
            now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            # 插入数据
            sql = "insert ignore   into topic(`title`,`topic_id`,`create_time`) values('{}','{}','{}')".format(title,
                                                                                                         topic_id, now)
            #print(sql)
            reCount = self.cur.execute(sql)
            self.conn.commit()

        self.cur.close()
        self.conn.close()
        return parent_topic

  

child_topic.py
# *_*coding:utf-8 *_*
import json
import urllib
from time import sleep

import pymysql
from lxml import etree
import requests

class GetChildTopic(object):
    def __init__(self):
        self.conn = pymysql.connect(host='192.168.33.10', user='root', passwd='root', db='spider', charset='utf8')
        self.cur = self.conn.cursor()

    def sql_filter(self,sql, max_length=20):
        dirty_stuff = ["\"", "\\", "/", "*", "'", "=", "-", "#", ";", "<", ">", "+", "%", "$", "(", ")", "%", "@", "!"]
        for stuff in dirty_stuff:
            sql = sql.replace(stuff, "")
        return sql[:max_length]

    def get_child_data(self,parent_id, total_pages):
        int(parent_id)

        for page in range(1, total_pages + 1):
            #sleep(1)
            output = []
            print("now_parent_id",parent_id,"now_page:",page)
            url = "https://www.zhihu.com/node/TopicsPlazzaListV2"
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
            }
            offset = (page - 1) * 20
            data = {'method': 'next', "params": json.dumps({"topic_id": parent_id, "offset": offset, "hash_id": ""})}
            response = requests.post(url, data=data, headers=headers)
            print(url,response,);
            print(data)

            res = response.json()['msg']
            if(len(res) < 0):
                break;
            for item in res:
                html = etree.HTML(item)
                title = html.xpath('//img/@alt')[0]
                img_url = html.xpath('//img/@src')[0]
                topic_url = html.xpath('//a[1]/@href')[0]
                topic_id = topic_url.split('/')[-1]
                topic_url = urllib.parse.urljoin(url, topic_url)
                desc = html.xpath('//p/text()')
                if desc is not None and len(desc) == 1:
                    desc = desc[0]
                else:
                    desc = ''

                title = self.sql_filter(title, 200)
                img_url = self.sql_filter(img_url, 200)
                topic_url = self.sql_filter(topic_url, 200)
                desc = self.sql_filter(desc, 200)

                output.append({'title': title, 'img_url': img_url, "topic_url": topic_url, "desc": desc, "topic_id": topic_id,'parent_id': parent_id})
            print(output)
            self.save_child_topic(output)




    def save_child_topic(self,data):
        for item in data:
            import time
            # 格式化成2016-03-20 11:45:39形式
            now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            # 插入数据
            sql = "insert  ignore into topic(`title`,`topic_id`,`img_url`,`parent_id`,`desc`,`topic_url`,`level`,`create_time`) values('{}','{}','{}','{}','{}','{}','{}','{}')".format(
                item['title'], item['topic_id'], item['img_url'], item['parent_id'], item['desc'], item['topic_url'], 1,
                now)
            #print(sql)
            reCount = self.cur.execute(sql)
            self.conn.commit()


    def __del__(self):
        self.cur.close()
        self.conn.close()

  sql

CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '标题',
  `topic_id` int(11) NOT NULL,
  `img_url` varchar(255) NOT NULL DEFAULT '' COMMENT '子标题图片',
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `desc` text,
  `create_time` varchar(255) NOT NULL DEFAULT '',
  `topic_url` varchar(255) DEFAULT '' COMMENT '子标题超链接',
  `level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0父级 ',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uni_top_par` (`topic_id`,`parent_id`),
  KEY `index_parent_id` (`parent_id`),
  KEY `index_topic_id` (`topic_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8379 DEFAULT CHARSET=utf8mb4;

  

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34326429/article/details/86444224

智能推荐

echarts 折线上写数值_关于ECharts折线图值的显示问题-程序员宅基地

文章浏览阅读3.4k次。我这边有两条折线,发现最上面那条折线图的值没有真正显示在y轴上,比如最上面的第一个点,值是30,为什么点要在y轴50上呢?我想显示在y轴30上,该怎么弄呢?option = {title: {text: '折线图堆叠'},tooltip: {trigger: 'axis'},legend: {data:['张三','李四']},grid: {left: '3%',right: '4%',botto..._echatrs 折线图显示数值

引入import ‘ant-design-vue/dist/antd.css‘时报错_module not found: error: can't resolve 'ant-design-程序员宅基地

文章浏览阅读6.2k次,点赞29次,收藏12次。提示 Module not found: Error: Can't resolve 'ant-design-vue/dist/antd.css' in 'D:\yupi\antd-demo\src'初始化前端时候总拉不下来ant.css文件,这个路径ant-design-vue 不存在css文件。后来发现官方文档给的是错误的,css文件叫reset.css。在使用Ant Design Vue 时初始化项目报错。_module not found: error: can't resolve 'ant-design-vue/dist/antd.css

linux应用程序快捷键,Linux中的快捷键,实用的终端命令-程序员宅基地

文章浏览阅读207次。linux中常常需要用到很多快捷键,方便我们查找与操作文件,提高工作效益。下面是比较实用的几个终端命令,很实用哦!一、命令行日常系快捷键如下的快捷方式非常有用,能够极大的提升你的工作效率:CTRL + U -剪切光标前的内容CTRL + K -剪切光标至行末的内容CTRL + Y -粘贴CTRL + E -移动光标到行末CTRL + A -移动光标到行首ALT + F -跳向下一个空格ALT + ..._linux显示第一个应用程序快捷键

python读取只读word只读_10.9 只读数据库(Read-only Database)-程序员宅基地

文章浏览阅读120次。如果你查看论文的图3,你可以发现,Aurora不仅有主数据库实例,同时多个数据库的副本。对于Aurora的许多客户来说,相比读写查询,他们会有多得多的只读请求。你可以设想一个Web服务器,如果你只是查看Web页面,那么后台的Web服务器需要读取大量的数据才能生成页面所需的内容,或许需要从数据库读取数百个条目。但是在浏览Web网页时,写请求就要少的多,或许一些统计数据要更新,或许需要更新历史记录,所..._python执行readonly database

web前端的恐怖之旅(6):字体文本属性_em写字体宽度的坑-程序员宅基地

文章浏览阅读201次。一,字体样式字体大小:font-size:12px;:具有继承性(系统限制最小为12像素,0为没有)单位 :), px 不给时,默认12像素 eg: 一般给body设置12px的字体大小),em 父级字体大小 eg:1em,父级字体大小×1倍​ - em用在不是font-size的地方,代表当前标签字体大小), rem html根标签的字体..._em写字体宽度的坑

数组&有序集合使用二分查找-程序员宅基地

文章浏览阅读581次,点赞6次,收藏8次。结束条件l=h时候是否可以呢,试想下假如nums集合只有一个元素,肯定要l=h。通过题目知道集合是有序的,那么可以通过二分查找提高查询效率。原理:简单总结下二分查找就是在某个。内,通过不断缩减查找范围提升查询效率。使用二分查找可以简单、快速查找到目标值。很明显遍历时候做了很多无效查询。

随便推点

HTML + CSS的基础知识 (1)_写一个简单的页面,要有一个大标题,两个小标题,有一个表格, 再写一个css文件,-程序员宅基地

文章浏览阅读148次。1. 什么是HTML、CSS是做网站的编程语言。浏览器把代码解析后的样子就是我们看到的网站,如何看到网站的原始代码呢?通过鼠标右键选择查看网页源代码。如何去写代码?写到哪里呢? 一个网站是由N多个网页组成的。 每一个网页 .html文件 电视剧,40集。 .mp4 文件2. VSCode编辑器VS code下载地址:https://code.visualstudio.com/如何安装插件? 语言包、 open in browser view in _写一个简单的页面,要有一个大标题,两个小标题,有一个表格, 再写一个css文件,

计算两个向量间的欧氏距离_计算两向量的欧式距离,余弦相似度-程序员宅基地

文章浏览阅读1.7k次。>>>import numpy>>>vec1=[[1,1,1],[2,2,2]]>>>vec2=[[2,2,2],[1,1,1]]>>>vec1=numpy.array(vec1)>>>vec2=numpy.array(vec2)>>>vec1array([[1, 1, 1],[2, 2, ..._举例计算欧氏空间两条向量之间的矩离

dva的用法_(入门)手把手带你更简单的使用dva-程序员宅基地

文章浏览阅读2.3k次。dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。特性易学易用,仅有 6 个 api,对 redux 用户尤其友好,配合 umi 使用后更是降低为 0 APIelm 概念,通过 reducers, effects 和 subscriptions 组织..._dva用法

C | 函数_c语言中 取两个值 小值的函数-程序员宅基地

文章浏览阅读103次。《C Primer Plus》读书笔记_c语言中 取两个值 小值的函数

金融贷款风险预测:使用图神经网络模型进行违约概率评估_开源代码库 神经网络模型预测贷款违约-程序员宅基地

文章浏览阅读1.4k次,点赞22次,收藏24次。要使用PyTorch和GNN(图神经网络)来预测金融贷款风险,并加入注意力机制,我们首先需要构建一个贷款风险预测的图数据集。然后,我们将设计一个基于注意力机制的GNN模型。以下是一个简化的代码示例,演示了如何使用PyTorch和PyTorch Geometric(一个流行的图神经网络库)来实现这一点。请注意,这只是一个起点,并且您可能需要根据您的具体需求进行调整。_开源代码库 神经网络模型预测贷款违约

python3.5 numpy mkl百度云_win7 64位 Python3.5 scipy,numpy+mkl, Gensim主题模型包安装-程序员宅基地

文章浏览阅读55次。1.环境win7 64位numpy-1.13.1+mkl-cp35-cp35m-win_amd64.whlscipy-0.19.1-cp35-cp35m-win_amd64.whlgensim-0.13.0rc1-cp35-cp35m-win_amd64.whl2.安装步骤(1)安装pip、numpypython.exe -m pip install F:\Gensim\numpy-1.13.1+..._numpy所有版本百度云

推荐文章

热门文章

相关标签