吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16818|回复: 84
收起左侧

[Python 转载] 【python爬虫】抛砖引玉--批量爬取某财富股票网证券机构宏观研报

  [复制链接]
fengmodel 发表于 2020-3-20 13:16
本帖最后由 fengmodel 于 2020-3-20 13:16 编辑

本人零基础自学python一个月,目的是为了能将平常一些人为机械化的操作交给机器进行,尝试写了一段代码,爬取证券机构发布的一些宏观研报

自学的视频和书籍:Python网络爬虫与信息提取_北京理工大学 嵩天MOOC,Learn Python3 the Hard Way

代码编写和调试工具:VS code,jupyter notebook(anaconda集成)

基本思路:
1. 首先获取进入宏观研报的页面,分析页面知道是JS显示
2. 获取真实json的链接,分析json的链接,可知链接里面参数含义,比如页面显示研报数量,第几页,查询起止时间,毫秒时间戳等等
3. 解析json,得到单独研报的标题、页面真实地址
4. 再次访问单独研报页面,获取’PDF‘的存放链接地址(这里的文件类型不一定是PDF,也有可能是excel)
5. 按标题修改文件并下载保存

花了一天多的时间完善这代码,其实还想了一些改善,但是还没有将它们实现;
我将不足和期望先提出来,希望抛砖引玉,有兴趣的朋友可以在评论中分享完善其他功能:
1. 为了防止被网站封禁,加了随机useragent,但是{代}{理}、多线程等功能还没学过,无法实现
2. 进度条可以有,但是还在研究
3. 研报存到指定的目录(没有就生成),并且判断文件是否存在,存在就跳过的功能
4. 我知道我的代码还可以再精简,但是知识经验太少,暂时就这样

本代码只是以学习为目的,而且本人也是初学者,有不足勿喷,感谢!



[Python] 纯文本查看 复制代码
import requests, json, time, random,os
from bs4 import BeautifulSoup

def UserAgent():
    user_agent_list = ['Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36',
                   'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36',
                   'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36',
                   'Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',
                   'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36',
                   'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36',
                   'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6',
                   'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36',
                   'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36',
                   'Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36']
    UserAgent={'User-Agent': random.choice(user_agent_list)}
    return UserAgent

def timenow():
    last_para = int(time.time() * 1000)
    now = int(time.time())
    timeArray = time.localtime(now)
    end_Time = time.strftime("%Y-%m-%d", timeArray)
    return last_para,end_Time

def macResearch_page(end_Time,last_para,UserAgent):
    # 经测试pageSize最大数值为100
    macResearchPageurl = 'http://reportapi.eastmoney.com/report/jg?pageSize=100&beginTime=2018-03-19&endTime=' + str(end_Time) + '&pageNo=1&fields=&qType=3&orgCode=&author=&_=' + str(last_para)
    macResearch='http://data.eastmoney.com/report/zw_macresearch.jshtml?encodeUrl='
    html = requests.get(macResearchPageurl, timeout=3, headers=UserAgent)
    text=html.text
    return text,macResearch

def parser_json(text,sub_url):
    djs = json.loads(text, encoding='utf-8')
    dic={}
    for item in djs['data']:
        item_publishDate=item['publishDate'][:10].split('-')[0]+item['publishDate'][:10].split('-')[1]+item['publishDate'][:10].split('-')[2]
        pdf_title=item_publishDate+item['title']
        page_url=sub_url+item["encodeUrl"]
        dic[pdf_title]=page_url
    return dic

def save_file(dic,UserAgent,num):
    # num是整数并且不能超过100
    a=0
    for key in dic.keys():
        url_r=dic[key]
        name=key
        real_html=requests.get(url_r,headers=UserAgent).text
        soup = BeautifulSoup(real_html, 'html.parser')
        file_url=soup.find_all('a',attrs={'class','pdf-link'})[0]['href']
        last_response=requests.get(file_url,headers=UserAgent)
        file_down=last_response.content
        file_name=name+'.'+file_url.split('.')[-1]
        content_size = int(last_response.headers['Content-Length']) / (1024*1024)
        print(file_url)
        with open(file_name,'wb') as f:
            f.write(file_down)
            f.close()
            print('成功!保存完成,文件大小:{:0.3f}MB'.format(content_size))
        a+=1
        if a==num:
            break



def main():
    num=int(input('注意:请输入1-100的整数:\n'))
    user_agent=UserAgent()
    last_para,end_Time=timenow()
    text,sub_url=macResearch_page(end_Time,last_para,user_agent)
    dic=parser_json(text,sub_url)
    save_file(dic,user_agent,num)
    print('全部完成!')
    

main()

网页分析

网页分析

运行演示

运行演示

免费评分

参与人数 17吾爱币 +14 热心值 +14 收起 理由
bamboo35 + 1 + 1 太需要了,请问怎么换成其他行业的链接?
hongpo850 + 1 我很赞同!
cuiruichao + 1 + 1 用心讨论,共获提升!
readmm + 1 + 1 给你封装了下 链接: 链接:https://pan.baidu.com/s/1eZNviffzRZ2B7pc5YV8.
MUMUAA + 1 我很赞同!
sunnylds7 + 1 热心回复!
ckyanc + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
superman88 + 1 + 1 为你的自学能力点赞
culprit + 1 + 1 用心讨论,共获提升!
泳诗 + 1 我很赞同!
jydcb003 + 1 我很赞同!
小白学代码 + 1 + 1 谢谢@Thanks!
执念i_ + 1 + 1 热心回复!
王星星 + 2 + 1 谢谢@Thanks!
yutian0yu + 1 热心回复!
music984 + 1 + 1 我很赞同!
小飞虫 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

readmm 发表于 2020-8-28 11:05
给你封装了下
链接: 链接:https://pan.baidu.com/s/1eZNviffzRZ2B7pc5YV89-A 提取码:dhqa
 楼主| fengmodel 发表于 2020-12-21 08:23
a1886733 发表于 2020-12-20 17:52
厉害 厉害 楼主自学的资源能否也一同分享下  感谢

你好,我是基本零基础,大学里计算机二级考的VB,基本没怎么用过。学Python,首先看的是《learn python3 the hard way》,本书也有中文版《笨方法学python》,一定要学python3版本;接下来爬虫课程可以看中国MOOC上嵩天老师的python爬虫;然后,看看别人的代码,能用到的部分保存下来....具体的资源搜索引擎都能找到
小涩席 发表于 2020-3-20 13:27
小飞虫 发表于 2020-3-20 13:27
我比你更白
key9928 发表于 2020-3-20 13:29
厉害了,学一个有能有成果了
plattl 发表于 2020-3-20 13:34
厉害了,学习下,收藏了,
孤丶宇 发表于 2020-3-20 13:35
哇 自学的 好厉害
moonalong8 发表于 2020-3-20 13:36
用python做日常证券投资买卖吗?厉害。。。。
我心很飞扬 发表于 2020-3-20 13:39
这个派森到底是干什么的 怎么会这么强大
liluli 发表于 2020-3-20 13:44
谢谢分享
jidesheng6 发表于 2020-3-20 14:09
膜拜大佬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 09:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表