查看原文
其他

如何将Python爬到的数据保存到MySQL中

徐露露 Stata and Python数据分析 2022-03-15

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

好消息:爬虫俱乐部隆重推出数据定制及处理业务啦,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部资深高级会员为您排忧解难!


在之前,我们已经介绍了Python与MySQL之间是如何进行交互的,那么接下来就进入实战部分,小编会教大家如何将每页爬取到的数据以字典的形式传送到MySQL中。在这里,作为练手的网页为希中网的希腊新闻导航下的任意一个新闻,比如我们作为例子的《颇受国人欢迎的Folli Follie面临数百万欧罚款》(“http://www.cgw.gr/news/PoShouGuoRenHuanYingDeFolliFollieMianLinShuBaiWanOuFaKuan.html”)。

我们需要抓取的信息主要有:标题,作者,来源,发布日期,浏览数,图片链接,新闻正文内容

抓取的主体思路如下:1.连接MySQL数据库,并在指定数据库下创建相应的数据表;2.抓取该页新闻的信息并以字典的形式保存;3.将上一步得到的字典传入MySQL。


1.连接MySQL数据库并创建相应的数据表

import pymysql
db = pymysql.connect(host='localhost', user='root',                     password='123456', port=3306, db='spiders') cursor = db.cursor() sql = 'CREATE TABLE IF NOT EXISTS xizhongwang (title VARCHAR(255) NOT NULL, ' \
     'laiyuan VARCHAR(255) NOT NULL, zuozhe VARCHAR(255) NOT NULL,' \
     'fabu VARCHAR(255) NOT NULL,liulan VARCHAR(255) NOT NULL,' \
     'neirongmediumtext NOT NULL,tupianmediumtext NOT NULL,PRIMARY KEY (title))'
cursor.execute(sql) db.close()

我们在spiders数据库下创建了一个叫xizhongwang的新表,里面包含着以上7个字段,由于内容和图片的内容可能很多,因此我们将其类型设为mediumtext,表示最大长度有16777215 个字元,notnull表示不允许为空,最后以title字段作为主键


2.抓取某一页新闻的信息并以字典的形式保存

2.1获取网页源代码

import requests
from random import randint
import time def getHTMLText(url):    
     while True:        
           try:               r = requests.get(url, timeout = 30)               r.encoding = r.apparent_encoding            
              return r.text
           except Exception as e:               print(e)               print("重新连接...")      time.sleep(randint(1,3))

     这里加入了try/except,如果出现了如网页连接超时,网络中断等问题时,会输出不能成功抓取的原因,并随机休息1-3秒,而加入while True则保证了未成功抓取时会一直反复尝试,直到成功。

2.2抓取一个网页的信息

我们在源代码中查找相应的信息所在的位置,并用正则表达式匹配出来:

def gethtmlinfo(url):    html = getHTMLText(url)    data = {}#创建一个空的字典用于存放
   data['title'] = re.findall(r'<h1>(.*?)</h1>', str(html))[0]    data['laiyuan'] = re.findall(r'来源:</strong>(.*?)</li>', html)[0]    data['zuozhe'] = re.findall(r'作者:</strong>(.*?)</li>', html)[0]    data['fabu'] = re.findall(r'<strong>发布日期:</strong>(.*?)</li>', html)[0]    data['liulan'] = re.findall(r'<strong>浏览数:</strong>(\d+)</ul>', html)[0]    data['neirong'] = re.sub(r'<.*?>|[\r\n\u3000]','',re.findall(r'<div id="Description">(.*?)<br><div>',html,re.S)[0])    data['tupian'] = 'http://www.cgw.gr' + re.findall(r'<span style="font-size: 14pt;"><imgsrc="(.*?)"', html)[0]
   return(data)

值得注意的是,查看新闻内容的源代码,每一段内容都是分开给出的。

因此在抓取内容时,我们添加参数:re.S,它的作用使得“.”能匹配的范围扩展到整个字符串,包括“\n”,也就是说它可以跨行进行匹配。由于使用正则匹配出来的结果以列表显示,所以以[0]选出字符串,另外,re.sub(r'<.*?>|[\r\n\u3000]','',html)表示将制定字符串替换为空。另外,由于源代码中图片给出的链接不完整,因此将其补全。

最后输出结果为:


3.将上一步得到的字典传入MySQL

构建一个函数pymysql将数据传到xizhongwang这个表中。

def pymysql(data):    table = 'xizhongwang'
   keys = ','.join(data.keys())    values = ', '.join(['%s'] * len(data))    cursor = db.cursor()    sql = 'replace INTO {table} ({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
   try:          if cursor.execute(sql, tuple(data.values())):              print('Successful')              db.commit()
   except:           print('Failed')           db.rollback()

我们会在程序运行结果窗口看到“Successful”,然后再去MySQL中看看我们的数据是否传到xizhongwang表:



注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~


                                   




             文字编辑:赵宇亮

  技术总编:刘贝贝

往期推文推荐:

1.爬虫俱乐部新版块--和我们一起学习Python

2.hello,MySQL--Stata连接MySQL数据库

3.hello,MySQL--odbcload读取MySQL数据

4.再爬俱乐部网站,推文目录大放送!

5.用Stata生成二维码—我的心思你来扫

6.Mata中的数据导出至Excel

7.谈谈图形中坐标设置的技巧

8.如何输出某个关键词在字符串中的所有位置?

9.想看什么书?Stata君帮你寻!——爬取中南财大图书馆书目信息

10.爬虫俱乐部隆重推出网上直播课程第一季




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存