抓取网页数据 php(【股票知识】小白练手的绝佳之选(一))
优采云 发布时间: 2021-12-04 10:30抓取网页数据 php(【股票知识】小白练手的绝佳之选(一))
这个题目选择先写代码再写文章,绝对可以用于页面元素分析,也需要对网站的数据加载做一些分析,得到最终的数据,我查到的两个数据源没有ip访问限制,质量有保证。绝对是小白修炼的绝佳选择。
郑重声明:本文仅用于学习和其他用途。
分析
首先,我们要爬取*敏*感*词*。您必须首先知道哪些股票可用。在这里,小编发现了一个网站,这个网站有一个股票代码列表:。
打开Chrome的开发者模式,一一选择股票代码。具体过程小编就不贴了,各位同学自行体会。
我们可以将所有股票代码存储在一个列表中,剩下的就是找到一个网站,循环取出每只股票的数据。
这个网站编辑已经找到了,同花顺,链接:。
想必所有聪明的同学都发现了这个链接中的000001就是股票代码。
接下来我们只需要拼接这个链接,就可以不断的获取到我们想要的数据了。
实战
首先先介绍一下这次实战用到的请求库和解析库:Requests和pyquery。数据存储终于登陆了Mysql。
获取股票代码列表
第一步当然是建立一个股票代码列表。我们先定义一个方法:
def get_stock_list(stockListURL):
r =requests.get(stockListURL, headers = headers)
doc = PyQuery(r.text)
list = []
# 获取所有 section 中 a 节点,并进行迭代
for i in doc('.stockTable a').items():
try:
href = i.attr.href
list.append(re.findall(r"\d{6}", href)[0])
except:
continue
list = [item.lower() for item in list] # 将爬取信息转换小写
return list复制代码
把上面的链接作为参数传入,可以自己运行看看结果,这里就不贴结果了,有点长。. .
获取详细数据
详细数据看起来像是在页面上,但实际上并不存在。实际获取数据的地方不是页面,而是数据接口。
http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code=000001复制代码
至于怎么查,这次就不说了。还是希望各位想学爬行的同学可以自己动手,多找几次,自然找到路。
既然有了数据接口,我们先来看看返回的数据:
showStockDate({"info":{"000001":{"name":"\u5e73\u5b89\u94f6\u884c"}},"data":{"000001":{"10":"16.13","8":"16.14","9":"15.87","13":"78795234.00","19":"1262802470.00","7":"16.12","15":"40225508.00","14":"37528826.00","69":"17.73","70":"14.51","12":"5","17":"945400.00","264648":"0.010","199112":"0.062","1968584":"0.406","2034120":"9.939","1378761":"16.026","526792":"1.675","395720":"-948073.000","461256":"-39.763","3475914":"313014790000.000","1771976":"1.100","6":"16.12","11":""}}})复制代码
很明显,这个结果不是标准的json数据,而是JSONP返回的标准格式的数据。这里我们先对header和end进行处理,将其转化为标准的json数据,然后针对这个页面上的数据进行解析,最后将解析出的值写入到数据库中。
def getStockInfo(list, stockInfoURL):
count = 0
for stock in list:
try:
url = stockInfoURL + stock
r = requests.get(url, headers=headers)
# 将获取到的数据封装进字典
dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
print(dict1)
# 获取字典中的数据构建写入数据模版
insert_data = {
"code": stock,
"name": dict1['info'][stock]['name'],
"jinkai": dict1['data'][stock]['7'],
"chengjiaoliang": dict1['data'][stock]['13'],
"zhenfu": dict1['data'][stock]['526792'],
"zuigao": dict1['data'][stock]['8'],
"chengjiaoe": dict1['data'][stock]['19'],
"huanshou": dict1['data'][stock]['1968584'],
"zuidi": dict1['data'][stock]['9'],
"zuoshou": dict1['data'][stock]['6'],
"liutongshizhi": dict1['data'][stock]['3475914']
}
cursor.execute(sql_insert, insert_data)
conn.commit()
print(stock, ':写入完成')
except:
print('写入异常')
# 遇到错误继续循环
continue复制代码
这里我们添加异常处理,因为这次爬取的数据比较多,很有可能会因为某些原因抛出异常。当然,我们不想在出现异常的时候中断数据的捕获,所以我们在这里添加了异常处理来继续捕获数据。
完整代码
我们稍微封装了一下代码,完成了这次实战。
import requests
import re
import json
from pyquery import PyQuery
import pymysql
# 数据库连接
def connect():
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='password',
database='test',
charset='utf8mb4')
# 获取操作游标
cursor = conn.cursor()
return {"conn": conn, "cursor": cursor}
connection = connect()
conn, cursor = connection['conn'], connection['cursor']
sql_insert = "insert into stock(code, name, jinkai, chengjiaoliang, zhenfu, zuigao, chengjiaoe, huanshou, zuidi, zuoshou, liutongshizhi, create_date) values (%(code)s, %(name)s, %(jinkai)s, %(chengjiaoliang)s, %(zhenfu)s, %(zuigao)s, %(chengjiaoe)s, %(huanshou)s, %(zuidi)s, %(zuoshou)s, %(liutongshizhi)s, now())"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
def get_stock_list(stockListURL):
r =requests.get(stockListURL, headers = headers)
doc = PyQuery(r.text)
list = []
# 获取所有 section 中 a 节点,并进行迭代
for i in doc('.stockTable a').items():
try:
href = i.attr.href
list.append(re.findall(r"\d{6}", href)[0])
except:
continue
list = [item.lower() for item in list] # 将爬取信息转换小写
return list
def getStockInfo(list, stockInfoURL):
count = 0
for stock in list:
try:
url = stockInfoURL + stock
r = requests.get(url, headers=headers)
# 将获取到的数据封装进字典
dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
print(dict1)
# 获取字典中的数据构建写入数据模版
insert_data = {
"code": stock,
"name": dict1['info'][stock]['name'],
"jinkai": dict1['data'][stock]['7'],
"chengjiaoliang": dict1['data'][stock]['13'],
"zhenfu": dict1['data'][stock]['526792'],
"zuigao": dict1['data'][stock]['8'],
"chengjiaoe": dict1['data'][stock]['19'],
"huanshou": dict1['data'][stock]['1968584'],
"zuidi": dict1['data'][stock]['9'],
"zuoshou": dict1['data'][stock]['6'],
"liutongshizhi": dict1['data'][stock]['3475914']
}
cursor.execute(sql_insert, insert_data)
conn.commit()
print(stock, ':写入完成')
except:
print('写入异常')
# 遇到错误继续循环
continue
def main():
stock_list_url = 'https://hq.gucheng.com/gpdmylb.html'
stock_info_url = 'http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code='
list = get_stock_list(stock_list_url)
# list = ['601766']
getStockInfo(list, stock_info_url)
if __name__ == '__main__':
main()复制代码
结果
最后,编辑器用了大约15分钟,成功抓取了4600+条数据,但是没有显示结果。
示例代码
如有需要,可后台私信联系,会议休会