2022年 11月 6日

python爬虫学习爬取股票数据

1.首先要导入几个模块

import requests
import pandas as pd
import re
import time
import random
from sqlalchemy import create_engine

2.要想爬取一个网页之前要先了解这个网页的源代码,按F12进入开发者工具,得到如下界面:

找到要爬取的网页的真实页面,可以看到要爬取的数据就在里面。点开Headers可以看到Request URL,所以这个网址就是要爬取的数据的网址。同时pn也代表页数,所以如果想要获取多页的数据,可以写一个for循环。

3.下面就开始进行数据的爬取。

#构造请求头,这里在爬虫中添加字典类型的请求头headers的目的是为了将python伪装成一个真实的浏览器,进而促使被访问的网站将python当作一个正常的访问用户。代码如下

headers={
‘Accept’: ‘*/*’,
‘Accept-Encoding’: ‘gzip, deflate’,
‘Accept-Language’: ‘zh-CN,zh;q=0.9’,
‘Connection’: ‘keep-alive’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36’ 
}

#生成需要抓取的链接,代码如下

urls=[]
for pz in range(1,50):
    urls.append(‘http://data.eastmoney.com/zjlx/detail.html’)

#循环并通过正则匹配获取相关数据

info=[]
for url in urls:
    seconds=random.randint(3,6)
    response=requests.get(url,headers=headers).text
    a=re.findall(“f12:'(.*?)'”,response)
    b=re.findall(“f14:'(.*?)'”,response)
    c=re.findall(“f2:'(.*?)'”,response)
    d=re.findall(“f3:(.*?)”,response)
    e=re.findall(“f62:'(.*?)’,”,response)
    f=re.findall(“f184:'(.*?),'”,response)
    g=re.findall(“f66:'(.*?)’,”,response)
    h=re.findall(“f69:'(.*?)’,”,response)
    i=re.findall(“f72:'(.*?)’,”,response)
    j=re.findall(“f75:'(.*?)’,”,response)
    k=re.findall(“f78:'(.*?)’,”,response)
    l=re.findall(“f81:'(.*?)’,”,response)
    m=re.findall(“f84:'(.*?)’,”,response)
    n=re.findall(“f87:'(.*?)’,”,response)
    info.append(pd.DataFrame({‘代码’:a,’名称’:b,’最新价’:c,’涨跌幅’:d,’主力净流入-净额’:e,
                              ‘主力净流入-净占比’:f,’超大单净流入-净额’:g,’超大单净流入-净占比’:h,
                              ‘大单净流入-净额’:i,’大单净流入-净占比’:j,’中单净流入-净额’:k,
                              ‘中单净流入-净占比’:l,’小单净流入-净额’:m,’小单净流入-净占比’:n}))
    time.sleep(seconds)
这里设置在爬虫的循环中随机停顿几秒,目的是为了减轻被访问网站的流量压力,否则单机在一秒内访问对方十几次甚至上百次,会消耗对方很多资源。也为了防止被访问的网站对爬虫代码实施反爬举措。

#将存储的所有股票数据进行合并,生成数据表格

eastmoney=pd.concat(info)

#最后将数据写到mysql数据库中

connect=create_engine(‘mysql+pymysql://root:root@localhost:3306/test?charset=utf-8’)
pd.io.sql.to_sql(eastmoney,connect,schema=’test’,if_exists=’append’)