查看原文
其他

基于MySQL数据库实现增量式爬取

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王   彤,中南财经政法大学统计与数学学院

本文编辑:杨婉清

技术总编:王子一

Stata&Python云端课程来啦!

     寒雪梅中尽,春风柳上归。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》;原价600元的正则表达式课程,现在仅需49.9元,详情请查看推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》;原价600元的基本字符串函数课程,现在仅需49.9元,更多信息请查看推文《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程;原价600元的网络爬虫课程,现在仅需49.9元,更多信息请查看推文《与春天有个约会,爬虫俱乐部重磅推出网络爬虫专题课程》原价600元的文本分析课程,现在仅需49.9元,更多信息请查看推文与春天有个约会,爬虫俱乐部重磅推出文本分析网络课程。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦
导言 在之前的文章“Python与数据库交互—浅述pymysql”中,我们介绍了使用pymysql库连接MySQL数据库,并实现增删改查操作。考虑到现在很多网站每天都会在源有网页的基础上增加当天的内容,那么我们可以布局一个增量式爬虫,每天在某个时间运行一下程序,爬取当天增加的内容。接下来,我们以爬取同花顺官网“财经要闻”板块为例,简单介绍一下作者的思路。
数据库连接

     程序开始,我们首先使用pymysql创建一个数据库连接对象以及游标对象,目的是在后面更好的执行SQL语句以及提交数据库执行。这一步骤我们在“Python与数据库交互—浅述pymysql”一文中有过详细介绍,我们要做的是创建一个tonghuashundb的数据库,接下来连接这个数据库,创建一个包含link字段ie_version表,一个包含title字段和time字段的ie_new表。

import pymysql
db = pymysql.connect( host = 'localhost', user = 'root', password = '你的密码', database = 'tonghuashundb', charset = 'utf8')cursor = db.cursor()
sql1 = "create table ie_version(link varchar(100))charset=utf8"sql2 = "create table ie_new(title varchar(100),time varchar(20))charset=utf8"
cursor.execute(sql1)cursor.execute(sql2)
db.commit()运行上述代码后,我们打开MySQL命令行,查看tonghuashundb数据库,看到以下结果:


增量爬取函数增量式爬虫,听起来十分高大上,其实原理比较简单,总结两个字:去重。那么如何实现呢?首先在发送请求或将数据存入数据库之前判断url是否爬过,如果没有爬过则发送请求、解析数据存入数据库,并把当前url地址存储数据库表中;如果url地址已经爬过,那么则不再向其发送请求或存入数据库,并打印内容提醒一下“当前数据已经存在了”。接下来,我们使用selenium爬取,定义一个实现增量式爬取“财经要闻”的函数,方便在每个页面调用提取数据。
from selenium import webdriverimport time
browser = webdriver.Chrome()browser.implicitly_wait(5)
def get_page(): browser.execute_script( 'window.scrollTo(0,document.body.scrollHeight)' ) time.sleep(2) li_list = browser.find_elements_by_xpath('/html/body/div[8]/div[1]/div[2]/ul/li') for li in li_list: link = li.find_element_by_xpath('./span/a').get_attribute('href') title = li.find_element_by_xpath('./span/a').text time = li.find_element_by_xpath('./span/span').text sel = 'select * from ie_version where link=%s' cursor.execute(sel,[link]) result = cursor.fetchall() if not result: ins1 = 'insert into ie_new values(%s,%s)' cursor.execute(ins1,[title,time]) ins2 = 'insert into ie_version values(%s)' cursor.execute(ins2,[link]) db.commit() print('数据爬取完成~') else: print('新闻已经存在啦~')开始爬取万事俱备,只欠东风。接下来就是烧一把火的时候了,我们定义一个主程序,访问每个新闻页面,并调用上面封装好的函数。
browser = webdriver.Chrome()start_url = 'http://news.10jqka.com.cn/today_list/'browser.get(start_url)
while True: get_data() if browser.page_source.find('下一页') != -1: button = self.browser.find_element_by_xpath('/html/body/div[8]/div[1]/div[2]/div/span[1]/a[@class="next"]') browser.execute_script("arguments[0].click();", button) time.sleep(2) else: print('今天的新闻爬取完成啦~')将以上的爬虫程序封装保存为tonghuashun.py文件。接下来是程序的运行,我们可以打开直接在Pycharm等环境中直接运行,也可以打开cmd命令行,输入python D:/PycharmProjects/pythonProject/spider/tonghuashun.py运行(注意:Python后面加入的是要运行文件所在的绝对路径;当然更重要的是要将Python添加到环境变量,否则系统会提示“Python不是可执行命令”哦~)按照方法二,运行程序,截图如下:

打开MySQL数据库,也能查询到刚刚爬取到的信息:


任务计划设置最后,我们要考虑的是怎样实现每日固定时间运行爬虫程序。方法如下:

1.打开电脑的“任务计划程序”,点击创建基本任务;

2.为任务定义一个名称,也可以自己添加一些描述信息;

3.设置每天什么时间打开程序,一路点击“下一步”,最后也是最重要的是添加路径。“程序或脚本”填入Python安装路径;“添加参数”填入py文件所在的绝对路径。

任务计划就设置完成了,接下来就是等待程序自动运行啦!好了,今天的内容就是这些了。这是一个非常简单的案例,大家可以尝试一下,或者找一个新的思路做一下。欢迎大家下方留言提问,如果感觉本篇文章有用的话帮忙点个“在看”吧~  最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


欢迎大家点赞评论转发呦~

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐         寻找春日气息|本月最受欢迎的景点都在这里!

问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!

Python与数据库交互—浅述pymysql

偷懒小妙招|selenium之玩转鼠标键盘操作--鼠标篇

大家用Stata来“找茬”

“粉墨登场”——多期双重差分法(DID)的Stata操作

Python与百度地图合璧,绘制棒呆的热力地图

【数据可视化】统计图绘制神器:Seaborn

检索Stata推文的“任意门”学会了这些,分分钟提升你的毕业体验

【爬虫实战】双一流大学的月关注度

【爬虫实战】“中国人不吃这一套”——人民日报微博评论分析

进化的标签管理助手——elabel命令

“学术明星”——双重差分法(DID)的Stata操作

偷懒小妙招| selenium之玩转鼠标键盘操作(上)

【爬虫实战】南京地铁又上热榜——客流量分析

renfiles:批量重命名文件的利器

Stata中字符串的处理

物以类聚——浅述k-means聚类算法

我在哪里?调用高德API获取地址经纬度信息

超级简单的条件函数,轻松生成虚拟变量

Python云端课程福利大放送!0基础也能学~

【爬虫实战】“我们,继续新故事”——爬取LOL英雄皮肤

“人像动漫化”—Python实现抖音特效

跨框架合并数据|frlink的用法,你get到了吗

《唐探3》做错了什么?|来自150万字影评的证据

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



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

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

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

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