fengmodel 发表于 2020-3-20 13:16

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

本帖最后由 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. 我知道我的代码还可以再精简,但是知识经验太少,暂时就这样

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



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('-')+item['publishDate'][:10].split('-')+item['publishDate'][:10].split('-')
      pdf_title=item_publishDate+item['title']
      page_url=sub_url+item["encodeUrl"]
      dic=page_url
    return dic

def save_file(dic,UserAgent,num):
    # num是整数并且不能超过100
    a=0
    for key in dic.keys():
      url_r=dic
      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'})['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()

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

感谢楼主分享!!!!{:301_984:}

小飞虫 发表于 2020-3-20 13:27

我比你更白:wwqwq

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

膜拜大佬
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 【python爬虫】抛砖引玉--批量爬取某财富股票网证券机构宏观研报