使用Python爬虫自动爬取沪港通每日持股数据

https://www.hkexnews.hk/sdw/search/searchsdw_c.aspx
港交所沪股通深股通数据披露页面
港交所沪股通深股通数据披露页面
该网站支持查询沪港通股票每日持股机构/券商的持股数据,有效期一年以内的。通俗得讲就是新闻里说的牛逼的北上资金每天买卖股票的数量,可以一定程度反应外资对该公司的受欢迎程度。

做这个爬虫其实是半年前的想法,因为本人持有的伊利股份是被外资大举买入的公司。所以想通过分析外资持股比例,来做一些研究。但是因当时没有学习Python,所以都是一页一页手动Ctrl+C加Ctrl+V。比较累,都是泪。参考了一点资料,感谢CSDN,并获得大师指点,终于搞成了,感谢。

好了废话不说,先上代码。

from  lxml import etree
import requests
import csv
import os

headers={"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}
url="https://www.hkexnews.hk/sdw/search/searchsdw_c.aspx"
datatime = {'__EVENTTARGET': 'btnSearch',
            '__EVENTARGUMENT':'',
            '__VIEWSTATE': '/wEPDwULLTIwNTMyMzMwMThkZHNjXATvSlyVIlPSDhuziMEZMG94',
            '__VIEWSTATEGENERATOR': '3B50BBBD',
            'today': '20190922',
            'sortBy': 'shareholding',
            'sortDirection': 'desc',
            'alertMsg':'',
            'txtShareholdingDate': '2019/08/22',
            'txtStockCode': '90887',
            'txtStockName': '伊利股份',
            'txtParticipantID':'',
            'txtParticipantName':''
            }
repensoe=requests.post(url,headers=headers,data=datatime)
text=repensoe.text
html1 = etree.HTML(text)
div = html1.xpath("//div[@id='pnlResultNormal']//tbody/tr")
data = []
print("--" * 2)
valuetime = html1.xpath("//input[@id='txtShareholdingDate']/@value")
print(valuetime[0]+"有数据")

for tb in div:
    participant_id = tb.xpath("./td[1]/div/text()")[1]
    participant_name = tb.xpath("./td[2]/div/text()")[1]
    participant_address = tb.xpath("./td[3]/div/text()")[1]
    right = tb.xpath("./td[4]/div/text()")[1]
    percent = tb.xpath("./td[5]/div/text()")[1]
    datadic = {"日期": valuetime[0], "参与者编号": participant_id, "中央系统参与者名称": participant_name, "地址": participant_address, "持股量": right,"占比": percent}
    data.append(datadic)
    filenme = '20190822' + ".csv"
    csvhead = ["日期", "参与者编号", "中央系统参与者名称", "地址", "持股量","占比"]

os.getcwd()
os.chdir("D:\\600887")
with open(filenme, 'w', newline='') as fp:
    write = csv.DictWriter(fp, csvhead)
    write.writeheader()
    write.writerows(data)

此代码可以自动获取指定日期的数据,并且自动保存成*.CSV文件到D:\600887文件夹。
程序调用了,requests库获取数据,lxml库解析数据,csv和os库来导出csv文件到指定文件夹下。

requests.post是模拟浏览器与网站服务器之间的数据输入输出,有点类似工控里的控制字。在弄这个爬虫时,也学习了一些最简单的HTML和CHROME使用知识。知道通过F12来运行开发者模式来查看当鼠标点击时,浏览器和服务器之间到底输入输出了什么内容。同时,分析网页的原HTML代码,定位具体数据在代码中的位置,方便使用xpath来解析、查询具体的位置。下面是几张网页解析的图片:
相关输入的命令
使用Python爬虫自动爬取沪港通每日持股数据_第1张图片
当点击搜寻时,浏览器发送的Data Form
使用Python爬虫自动爬取沪港通每日持股数据_第2张图片
网页源代码中存放数据的table
使用Python爬虫自动爬取沪港通每日持股数据_第3张图片
最终爬取的数据格式,最近伊利被外资疯狂抛售,看来激励计划被鄙视了
使用Python爬虫自动爬取沪港通每日持股数据_第4张图片

你可能感兴趣的:(爬虫)