Python爬虫 获取雪球网股票讨论内容( 获取json文件的内容)

由于期末课程作业的数据需要用到投资网站的评论,所以就准备从雪球网上爬取了。话不多说,下面就进入正题。

思路分析

首先登入雪球网,输入自己的关键词查找相关评论。

奶奶年
然后通过F12或者右键-检查进入控制台。
在这里插入图片描述
再点击网络查找我们需要的内容封装在哪里。第一次点击时会发现只有如下所示的空白页面,只需要再刷新一下就可以了。
在这里插入图片描述
之后发现我们需要的评论内容封装在左侧所示的json文件中,预览以后可见每一条评论都以字典的方式存储,当页的(每页有十条,通过“size:10”可知)所有都评论存在list列表中。
在这里插入图片描述
展开每一条评论即可查看网页提供的具体内容,大家可以按照自己所需要的提取相关内容(这次我需要获取每条评论的时间(timeBefore)和具体内容的链接(target),需要通过访问这个链接获取评论文章的具体内容)
在这里插入图片描述
下面就是通过我们获取到的链接访问的具体内容页面,同样进入控制台,可以看到内容在article_bd_detail标签中。我们将通过 BeautifulSoup和正则表达式进行网页清洗。
在这里插入图片描述

前情提要就到这了,下面上代码。

代码部分

1、用于下载网页的代码:

import pandas as pd
from bs4 import BeautifulSoup
import re
import requests
import json


def download_page(url,para = None):#声明的用来下载网页的方法
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
               ' Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59'}
    if para:
        response = requests.get(url,params=para,headers = headers)
    else:
        response = requests.get(url,headers = headers)  
    response.encoding = response.apparent_encoding
    if response.status_code == 200:
        return response.text
    else:
        print ("failed to download the page") 

2、用于获取雪球网评论内容的关键代码:(可以自己选择一次性爬多少。) OS:主要是我怕我的电脑遭不住一次性爬完所有评论,才加了这个功能。各位读者要是觉得太麻烦,可以自己改改,不要这个功能的。

def xueqiu(Start,End):   #两个参数分别表示开始读取与结束读取的网页页码
    comments_list = []  
    #将响应头的参数补齐以避免无法读取的情况
    headers = {"Refer":"https://xueqiu.com/k?q=%E9%99%90%E5%94%AE%E8%82%A1%E8%A7%A3%E7%A6%81",
           "Host": "xueqiu.com",
           "Cookie":"acw_tc=2760820216245210669791692ead10af083a4c98f7b2541837fa80a96e6849; xq_a_token=f257b9741beeb7f05f6296e58041e56c810c8ef8; xqat=f257b9741beeb7f05f6296e58041e56c810c8ef8; xq_r_token=2e05f6c50e316248a8a08ab6a47bc781da7fddfb; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTYyNjQwMzgwNSwiY3RtIjoxNjI0NTIxMDUxMDg4LCJjaWQiOiJkOWQwbjRBWnVwIn0.YuyB7t3x8jCpO5aenapczHmoXzYznlC9XUntALPpBV8pBEZIBi1LU8oltfyvxRMerCY3VqsBR8moa64fSvxzArV0RMuL7633bjcB-b0GrQY3tvsva0Nlfj7w3tRTavMfw04fU_LruFbHhoc-LR-D83lH7e_Ndp4ZmwIayI3SEARBHqDWa4RjZ-KAxLiQ-hnS8usiodS8cxyTrmNtcr0hLB59zPCRq2KzO3RCVFuYmaNIRyWXXqcmjFS3tvpQ4FlOLC4YVOzqlb-vyhWJAAuQTXj7-z6XnQcRHRNQw53WRmiivgzv3YVPqIq0qQslJjIczAmmTeZxqYEy3ZMan3Bwow; u=441624521066981; Hm_lvt_1db88642e346389874251b5a1eded6e3=1624521071; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1624521079; device_id=24700f9f1986800ab4fcc880530dd0ed",
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'}
     #遍历每一个URL
    for i in range(int(Start),int(End)+1):
        url='https://xueqiu.com/query/v1/search/status.json?sortId=3&q=%E9%99%90%E5%94%AE%E8%82%A1%E8%A7%A3%E7%A6%81&count=10''&page='+ str(i)
       # print(url)    用于检查
        response = requests.get(url, headers=headers, verify=False, timeout=30)   # 禁止重定向
        content = response.text
        #读取的是json文件。因此就用json打开啦
        result = json.loads(content)  
        #找到原始页面中数据所在地
        comments = result['list']                
        for i in range (0,len(comments)):            
            comment={}            
            #取出需要的字段并存入字典中
            comment['time']=comments[i]['timeBefore']            
            comment['target']=comments[i]['target']  
            #从初始页面获取内容的链接(不全,需要自行补齐),直接调用自己的方法(方法在第3步)读取文本内容
            comment['text'] = get_text("https://xueqiu.com"+comments[i]['target'])
            comments_list.append(comment)               
    return comments_list

3、用来通过链接获取具体内容的代码(包括数据清洗):

def get_text(url):       
    soup=BeautifulSoup(download_page(url))
    pattern = re.compile("article__bd__detail.*?")#按标签寻找
    all_comments = soup.find_all("div",{'class':pattern})
    text1=all_comments[0]
    con=text1.get_text()#只提取文字   
    return con

4、将提取的内容存在comments_data.csv文件中:

def output_csv(datalist):
    print(type(datalist),len(datalist))  # <class 'list'> 100用于检查
    import csv
    csv_file = open("comments_data.csv", 'a+', newline='', encoding='utf-8-sig')  # 解决中文乱码问题。a+表示向csv文件追加
    writer = csv.writer(csv_file)
    writer.writerow(['Date', 'URL', 'Content'])
    for data in datalist:
        writer.writerow([data['time'], "https://xueqiu.com"+data['target'],data['text'],])#原来的链接不全因此给他补齐
    csv_file.close()

完整的代码

import pandas as pd
from bs4 import BeautifulSoup
import re
import requests
import json


def download_page(url,para = None):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
               ' Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59'}
    if para:
        response = requests.get(url,params=para,headers = headers)
    else:
        response = requests.get(url,headers = headers)  
    response.encoding = response.apparent_encoding
    if response.status_code == 200:
        return response.text
    else:
        print ("failed to download the page") 
        
        
def xueqiu(Start,End):   #两个参数分别表示开始读取与结束读取的页码
    comments_list = []  
    #将响应头的参数补齐以避免无法读取的情况
    headers = {"Refer":"https://xueqiu.com/k?q=%E9%99%90%E5%94%AE%E8%82%A1%E8%A7%A3%E7%A6%81",
           "Host": "xueqiu.com",
           "Cookie":"acw_tc=2760820216245210669791692ead10af083a4c98f7b2541837fa80a96e6849; xq_a_token=f257b9741beeb7f05f6296e58041e56c810c8ef8; xqat=f257b9741beeb7f05f6296e58041e56c810c8ef8; xq_r_token=2e05f6c50e316248a8a08ab6a47bc781da7fddfb; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTYyNjQwMzgwNSwiY3RtIjoxNjI0NTIxMDUxMDg4LCJjaWQiOiJkOWQwbjRBWnVwIn0.YuyB7t3x8jCpO5aenapczHmoXzYznlC9XUntALPpBV8pBEZIBi1LU8oltfyvxRMerCY3VqsBR8moa64fSvxzArV0RMuL7633bjcB-b0GrQY3tvsva0Nlfj7w3tRTavMfw04fU_LruFbHhoc-LR-D83lH7e_Ndp4ZmwIayI3SEARBHqDWa4RjZ-KAxLiQ-hnS8usiodS8cxyTrmNtcr0hLB59zPCRq2KzO3RCVFuYmaNIRyWXXqcmjFS3tvpQ4FlOLC4YVOzqlb-vyhWJAAuQTXj7-z6XnQcRHRNQw53WRmiivgzv3YVPqIq0qQslJjIczAmmTeZxqYEy3ZMan3Bwow; u=441624521066981; Hm_lvt_1db88642e346389874251b5a1eded6e3=1624521071; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1624521079; device_id=24700f9f1986800ab4fcc880530dd0ed",
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'}
     #遍历每一个URL
    for i in range(int(Start),int(End)+1):
        url='https://xueqiu.com/query/v1/search/status.json?sortId=3&q=%E9%99%90%E5%94%AE%E8%82%A1%E8%A7%A3%E7%A6%81&count=10''&page='+ str(i)
       # print(url)    用于检查
        response = requests.get(url, headers=headers, verify=False, timeout=30)   # 禁止重定向
        content = response.text
        #读取的是json文件。因此就用json打开啦
        result = json.loads(content)  
        #找到原始页面中数据所在地
        comments = result['list']                
        for i in range (0,len(comments)):            
            comment={}            
            #取出需要的字段并存入字典中
            comment['time']=comments[i]['timeBefore']            
            comment['target']=comments[i]['target']  
            #从初始页面获取内容的链接(不全,需要自行补齐),直接调用自己的方法读取文本内容
            comment['text'] = get_text("https://xueqiu.com"+comments[i]['target'])
            comments_list.append(comment)               
    return comments_list

def get_text(url):       
    soup=BeautifulSoup(download_page(url))
    pattern = re.compile("article__bd__detail.*?")#按标签寻找
    all_comments = soup.find_all("div",{'class':pattern})
    text1=all_comments[0]
    con=text1.get_text()#只提取文字   
    return con

def output_csv(datalist):
    print(type(datalist),len(datalist))  # <class 'list'> 100用于检查
    import csv
    csv_file = open("comments_data.csv", 'a+', newline='', encoding='utf-8-sig')  # 解决中文乱码问题。a+表示向csv文件追加
    writer = csv.writer(csv_file)
    writer.writerow(['Date', 'URL', 'Content'])
    for data in datalist:
        writer.writerow([data['time'], "https://xueqiu.com"+data['target'],data['text'],])#原来的链接不全因此给他补齐
    csv_file.close()

if __name__=="__main__":
    Start = input('请输入开始爬取的页数:') 
    End = input('请输入结束爬取的页数:')
    result = xueqiu(Start,End)
    output_csv(result)

以上就是整个分析流程与代码,希望这个分享对大家有所帮助。

题外话:这是第一次写博客,措辞排版的还请各位多多包涵;本人也是在学习阶段,记录这些东西更多的是想交流分享,若有不严谨之处,希望各位多多提建议啦~

  • 22
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值