目的
爬取上证e互动 (sseinfo.com)中的问董秘数据,如下图。
运行环境
操作系统:windows 10
浏览器:Chrome
Python
版本:3.8
使用的第三方库:requests
、json
、time
查看数据
首先我们先查看一家公司的数据,然后向下翻页,可以发现网页是自动加载数据的,边上的竖条一直都翻不到底。
抓包
OK,知道数据是动态加载的,那我们只需在检查模式下,让网页再加载一条数据就可以了。这个时候打开检查模式并切换到网络,数据框中应该是空的,因为我们并没有向服务器请求数据。如果有数据,那我们按清除即可。
清除数据后,再向下滑动页面,让网页加载数据。可得到数据接口网址(http://sns.sseinfo.com/ajax/userfeeds.do?typeCode=company&type=11&pageSize=10&uid=382&page=3)。
抓取一条数据
这次返回的数据不是json
格式,所以我们需要使用一些解析工具,我使用的是BeautifulSoup
,也是一个非常常见的爬虫工具,文档附在这边,需要的小伙伴可以自行查看。Beautiful Soup 4.2.0 文档。下边是写好的函数。
def pars_soup(soup):
items = []
m_feed_item_list = soup.find_all('div', 'm_feed_item')
for m_feed_item in m_feed_item_list:
temp = dict()
id = m_feed_item.get('id')
name = m_feed_item.find('p').text
qa = m_feed_item.find_all('div', 'm_feed_txt')
q = qa[0].text.strip()
if len(qa) == 2:
a = qa[1].text.strip()
else:
a = ''
temp['id'] = id
temp['name'] = name
temp['question'] = q
temp['answer'] = a
items.append(temp)
return items
url = 'http://sns.sseinfo.com/ajax/userfeeds.do?typeCode=company&type=11&pageSize=10&uid=382&page=3'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36 Edg/91.0.864.48',
}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, features="html.parser")
print(pars_soup(soup))
# 输出
# [{'id': 'item-777592', 'name': '瓜农王老五', 'question': ':*ST广珠(600382)地产只有事故,白酒才有故事。(1)“健康养生公司”抵债,公司将成为第二个福星股份、南京高科。(2)“珍珠红酒业”抵债,公司将成为第二个大豪科技、舍得酒业。老头谏言:公司在《二次问询函回复公告》、《资产抵债问询函回复公告》内,向全体股民详细介绍一下“珍珠红酒业”的经营现状,以及美好的发展前景!谢谢!', 'answer': '瓜农王老五先生,您好,感谢您的建议,谢谢。'}, ...]
获取更多数据
观察网址可以发现,其中pageSize
是指一次获取数据的数量,最大为100;uid
为公司代码,似乎是股票代码后面几位;page
为当前页码。由此我们可以构造一个网址生成器,不断的获取新数据。
# 主页获取的接口网址生成
def main_page_url(uid, size=10):
page = 1
while True:
url = f'http://sns.sseinfo.com/ajax/userfeeds.do?typeCode=company&type=11&pageSize={size}&uid={uid}&page={page}'
yield url
page += 1
效果展示
最终数据使用tsv
格式保存。
代码获取
本文完整代码可关注公众号<卡卡KSCN>,回复<上证问董秘爬虫>获取
本文首发于微信公众号<卡卡KSCN>,欢迎关注