以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,转载请说明出处,谢谢合作!
大噶好!我是python练习时长一个半月的Yhen.
好久没有发博客啦!第一是因为最近学校方面的学习和部门工作比较多,时间少了。第二个是感觉爬虫方面的博客写的也比较多了,而且爬虫这东西,你做多了,就会感觉方法套路都是差不多的,无非就是获取数据+解析数据+储存数据。再写一般的爬虫文章可能会没有这么容易吸引大家的阅读的兴趣了。所以我就在想先去学习新的知识,再来把我觉得比较有趣有用的知识分享给大家。
虽然以后的内容应该还是会以爬虫为主,但是我尽可能在项目的选择上选择一些大家比较感兴趣的或者改进爬虫代码,用更高效率的方式来爬。以后有时间的话,会分享下用多协程来完成爬虫任务以及用scrapy爬虫框架来进行爬取。
我现在准备学习数据分析,以后在学习的过程中也会分享一些有趣的经验给大家。
今天给大家分享的项目还是以爬虫为基础的,但和我之前的项目有所不同的是,之前的数据都是储存在txt文件里的。今天我们要把这些数据保存到数据库中去。最后会把源码也分享给大家!
PS:关于数据库,我也是初学者。今天的教程是我看了腾讯课堂老师的视频后,自己实践成功后写出来分享给大家的。也算是作为自己的一个笔记吧。因为我也和大家一样,都是刚刚接触的,所以有些地方可能能理解的不是很透彻。所以也请大佬们多多包涵,若发现我有错误的地方,请在评论区指正!谢谢大家!
好啦,话不多说了,马上开始今天的分享
1.今天我们用到的是最常用的数据库MySQL,因为它是开源,最重要的是免费的!!!
下载安装教程
mysql下载安装教程
2.如果刚刚大家安装的时候,安装了mysql workbeach了请忽略这一步
如果没有,请安装mysql workbeach,这个是mysql数据化的可视化软件,(其实没有安装也是没有影响的,只是在这里面可以更方便的查看数据。待会我也会演示直接用mysql查看数据库数据表的数据)
mysql workbench如何下载安装,详细教程
我在安装mysqlworkbeach的时候就提示缺少visual c++2019,我在网上找到了资源,但是现在找不回网址了。于是我把它保存到网盘。如果和我出现同样情况的同学可以下载
链接:https://pan.baidu.com/s/1R4mm3IGK8jmmAdyJ2YMukw
提取码:78f4
复制这段内容后打开百度网盘手机App,操作更方便哦
安装好软件后,接下来就是今天要用到的一些第三方库了
3.第三方库(需要自行安装.如在终端输入:pip install+库名)
requests 这个不用解释了吧 经典爬虫库呢
pandas 一个数据分析基础库 今天就是要用它来实现储存数据到数据库中去
Bs4 今天用里面的Beautifulsoup来进行数据的定位解析
sqlalchemy 这个就是和数据库有关的第三方库了。用它来导入引擎,可以理解为是ORM的一个框架。它可以把数据中当中关于表格的操作转化为面向对象的操作。
OK,第三方库都安装好了以后
就正式开始今天的分享啦
今天我们要爬取的项目是中商产业研究所里面提供的A股上市公司名单
url:
https://s.askci.com/stock/a/0-0?reportTime=2019-12-31&pageNum=2#QueryCondition
我们下拉页面,找到这个表格的数据
我们今天的目标是把这一整个表格爬取下来,并保存到数据库
其实pandas里面有个方法是可以把页面中的所有tables标签的数据爬取下来并保存到DateFrame对象中
那么我为什么还要用Beautifulsoup呢?因为在这个表格上面还有两个表格,而我们只想要截图里面的这个表格里面的数据,所以我们要通过Beautifulsoup来进行定位获取到这个表格的数据
ok,所以我们的思路是
1.通过requests获取数据
2.用Beautifulsoup解析到我们想要表格的数据
3.用Pandas把tables标签下所有数据保存到数据库
下面带大家代码来实现
首先是导包
因为刚刚准备的时候已经和大家说明每个库的大概用法
所以我这里就直接全部导入了
#必备爬虫库
import requests
# 导入panda库 取别名pd
import pandas as pd
# 导入BeautifulSoup数据解析库
from bs4 import BeautifulSoup
# 从sqlalchemy导入引擎create_engine
from sqlalchemy import create_engine
我们首先带着请求头浏览器类型对这个网页发送请求
因为一些疏忽,我这里演示的是第一页的页面
但是我实际代码实现的是第二页的抓取
但是无关紧要,是完全不影响这个教程的
#要爬取的网址
url ='https://s.askci.com/stock/a/0-0?reportTime=2019-12-31&pageNum=2#QueryCondition'
# 请求头:浏览器类型
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'}
# 发送请求 获取其源码
res =requests.get(url,headers=headers).text
我们打印下看能否正常得到数据呢
可以看到是没有问题的,我们的股票数据也获取了,也没有出现乱码问题
那么接下来就是提取定位数据啦
首先打开我们的检查工具后
按照下图的步骤操作
定位到表格的数据后
可以看到控制台定位到了一个a标签
我们再往上找它的上一个table标签
于是找到了这么一个table标签
没错!他就是我们要找的table
那么怎么定位数据呢?大家一般用Beautifulsoup都是用它的find或者find_all 标签的用法吧?
但是今天我们不用它,而是用select方法来定位数据
那么select怎么找呢?
非常简单
首先,在table标签处点击一下
然后右键单击
找到 ‘copy’—>‘copy select’ 即可
接下来就用代码把数据提取出来
# 将数据解析为BS对象 , 解析方法选择“lxml”
html =BeautifulSoup(res,"lxml")
# 用select的方式提取数据 返回的是列表类型的数据 通过索引取出数据
# #myTable04可直接在浏览器copy
a =html.select('#myTable04')[0]
那么,接下来就是全新的内容:储存数据到数据库 了
怎么操作呢?
先看代码
# 通过read_html方法解析数据,通过索引取出DataFrame数据 ,header=0不添加表头
rusult=pd.read_html(a.prettify(),header=0)[0]
这一行代码是通过pandas的 read_html方法来解析数据
他可以自动获取到数据中table标签下的所有数据
里面的参数 a.prettify()的意思是对数据进行美化 header=0是不添加表头的意思
因为这个数据本身还是一个Bs的对象数据
所以我们要通过索引来取出DateFrame数据
PS:DateFrame是一种表格型数据结构
接下来就是python与数据库的连接配置操作了
注意:你要连接的前提是你电脑必须要已经安装了MySQL数据库了
# 通过create_engine引擎连接数据库
# create_engine('要连接的数据库+连接使用的API://数据库账户名:数据库密码@主机号:端口/存入的库名?字符编码')
conn =create_engine('mysql+pymysql://root:root@localhost:3306/hyh?charset=utf8')
# stock0332 保存的表名
# con=conn 用刚刚设置好的引擎连接
# if_exists ='append' 如果表存在就追加
rusult.to_sql('stock0332',con=conn,if_exists ='append')
首先要创建一个引擎(python和MySQL连接的通道)
这里看似要传很多数据,其实都是套路操作
这是我总结的
conn =create_engine(‘要连接的数据库+连接使用的API://数据库账户名:数据库密码@主机号:端口/存入的库名?字符编码’)
如果是本地的数据库,主机号localhost。
端口如果当时安装没有修改的话默认是3306(这里建议大家默认即可)
账户名默认为root
数据库名:这个hyh是我自己建的库
Mysql在安装后默认有以下库
information_schema,mysql,performance_schema,test
大家可以选择一个作为你要存放的库
rusult.to_sql(‘stock0331’,con=conn,if_exists =‘append’)
最后一行就是通过上面的引擎,把我们的DataFrame数据存入数据库中去,‘stock0332’是我要新建保存数据的表名,如果这张表不存在就创建,如果存在就追加
但是如果我们就这样执行代码的话
发现是会报一个(pymysql.err.InternalError) (1366:的错误的
(因为我已经修改配置,所以无法截图演示)
这个问题可是困扰了我一个上午啊,把这个错误信息发到百度,也没有找到解决方法。
于是我修改查询关键词为‘pandas写入mysql报错’
终于在一篇知乎文章里面找到了解决了方法!
原文链接
Pandas写入mysql报错:(pymysql.err.InternalError) (1366:
文中说这是字符编码问题,因为数据库的默认编码是utf8,只支持3字节的数据。而我们存入的数据有些的4个字节的字符。所以要把数据库的编码修改为utf8mb4
然后里面详细的介绍了解决的方法
1.更改已经建好的数据库和数据表类型
更改数据库编码:
ALTER DATABASE DATABASE_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
更改表编码:
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATEutf8mb4_general_ci;
Ps:这些都是SQL语句,需要在mysql或者mysqlworkbeach里面执行,不要在复制到python里面执行了哦
这些不难,直接复制就行。下面语句中我加粗的DATABASE_NAME和TABLE_NAME对应的是你要修改的库名和表名(请根据自己的情况把它们替换掉)
修改完成后,就可以导入啦
先给大家看看导入前我的hyh库中里面都有什么表
然后代码执行完成后
再来看看会发生什么
可以看到,变成了4个表
成功生成了stock0332表
我们再来看看是否表中都插入股票信息呢?
执行代码 select * from stock0332;
看,是不是成功的把股票信息都录入啦!
现在看起来有点乱,是因为数据太多了
我们再到mysqlworkbeach里面看看
是不是就很美观了呢
再来回到网页验证下
数据库里面的内容和网页的一样
所以是成功把网页的第二页数据给保存到数据库里面了!
完结啦!
把源码给大家
# 必备爬虫库
import requests
# 导入panda库 取别名pd
import pandas as pd
# 导入BeautifulSoup数据解析库
from bs4 import BeautifulSoup
# 从sqlalchemy导入引擎create_engine
from sqlalchemy import create_engine
#要爬取的网址
url ='https://s.askci.com/stock/a/0-0?reportTime=2019-12-31&pageNum=2#QueryCondition'
# 请求头:浏览器类型
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'}
# 发送请求 获取其源码
res =requests.get(url,headers=headers).text
# 将数据解析为BS对象 , 解析方法选择“lxml”
html =BeautifulSoup(res,"lxml")
# 用select的方式提取数据 返回的是列表类型的数据 通过索引取出数据
# #myTable04可直接在浏览器copy
a =html.select('#myTable04')[0]
# 通过read_html方法解析数据,通过索引取出DataFrame数据 ,header=0不添加表头
rusult=pd.read_html(a.prettify(),header=0)[0]
# 通过create_engine引擎连接数据库
# create_engine('要连接的数据+连接使用的API://数据库账户名:数据库密码@主机号:端口/存入的库名?字符编码')
conn =create_engine('mysql+pymysql://root:root@localhost:3306/hyh?charset=utf8')
# stock0332 保存的表名
# con=conn 用刚刚设置好的引擎连接
# if_exists ='append' 如果表存在就追加
rusult.to_sql('stock0332',con=conn,if_exists ='append')
最后祝大家假期愉快!
【爬虫】Yhen手把手带你用python爬小说网站,全网打尽,想看就看!
(这可能会是你看过最详细的教程)
【爬虫】Yhen手把手带你用python爬取知乎大佬热门文章
【爬虫】Yhen手把手教你爬取表情包,让你成为斗图界最靓的仔
【爬虫】Yhen手把手带你爬取去哪儿网热门旅游信息(并打包成旅游信息查询小工具
【selenium爬虫】Yhen手把手带你用selenium自动化爬虫爬取海贼王动漫图片
【爬虫】秀才不出门,天下事尽知。你也能做到!Yhen手把手带你打造每日新闻资讯速达小工具。