解决爬虫数据存入MySQL数据库时报错问题

in #cn7 years ago

这两天写了一个Python爬虫脚本,用来爬取游戏社区Taptap的用户评论数据,希望在之后对游戏玩家的口味、调性、喜好等做一些细致的分析。

简单介绍一下这个爬虫。

这个爬虫采用的是经典的python爬虫框架Scrapy,我大概花了4个小时的时间来构建爬虫程序,整个工作流程为:

  • 分析网站结构,确定爬虫思路
  • 编写爬虫的抓取主程序,请求网站页面
  • 编写爬虫解析程序,获取希望的数据结构
  • 编写爬虫存储程序,将数据实时导入至Mysql本地数据库
  • 构建反爬取策略,模拟真人浏览访问

这个爬虫的爬取速度还是比较令我满意的。经过实际测试,在正常的办公网络环境下,平均每秒可以抓取30个网页的数据。TapTap全站300多万的评论数据,预计一台电脑也只要3天时间就能全部获取下来了。

(TapTap游戏评论数据库截图)

不过,在观察Scrapy爬取日志的时候,我发现少部分数据没有成功导入数据,程序出现了异常。

(Scrapy爬取异常日志截图)

错误信息如下:pymysql.err.ProgrammingError:(1064,"You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near 't get fired!

我先是瞅了瞅代码,试着重新测试运行,发现没啥问题呀。然后,我又去爬取错误的网页里看了看,相应的字段也不缺啊?那就是数据在入库的时候出了错误。

上面这段代码的大致意思是,pymysql(python的一个MySQL处理包)语法错误,你的sql语句中有一处错误;请查看对应MySQL服务版本的指南,了解’t get fired!附近的语法应该怎么写。

原来是爬取数据存储到MySQL数据库时出错了。由于Python是对单引号和双引号敏感的,当抓取数据字符串中存在单引号时,导入数据库就会报错。

(爬取字段的数据里存在引号)
这是一个比较严重的问题了,因为中文用户在评论里也会经常使用单引号、双引号作强调或者标注。如果放任这个bug不管的话,会存在大量不必要的数据损失。

为了解决这个问题,我前后花了1个小时,使用Google搜索关键词「Insert value contaning single quote python」,最终在考较多个搜索结果提供的实例后,终于在Stackoverflow上找到了答案。

(StackOverFlow找到的相关问题)
答案中给到的示例代码是:

cur.execute('insert into tempPDBcode (PDBcode) values (%s);', s) 

而原来的代码是:

cur = x.cnx.cursor()
cur.execute('insert into tempPDBcode (PDBcode) values (%s);' % (s)) 
rows = cur.fetchall()

只需要将原本的SQL插入语句更改一下,在cur.execute()方法里传入两个变量即可。

按照示例的代码对脚本重新修改后,再次运行,excellent!现在,数据源源不断地录入到数据库里。几天之后,我就将获得TapTap社区预计300多万条的游戏评论数据。

通过这些数据,也许也能挖掘到一些有趣的信息哦,届时再跟大家分享。

结语

我很早就接触了编程,但一直没有能坚持下来。今年的编程学习与以往不一样,因为我将编程与日常生活结合起来,让编程有了应用的场景。

学习编程,的确是步步坎坷。写爬虫脚本的时候,类似本文中的BUG错误经常会出现,而我能依靠的只有自己和互联网。

值得庆幸的是,程序员是我见过最有分享精神的人群。当你遇到困难的时候,只要学会正确的提问方式,就一定能在网上找到你需要的答案。

但在检索方面请注意一点。

一定要学会用英文Google上检索问题,尽量避免用中文检索,绝对不要用百度去检索

Happy Coding!


文章首发于https://steemit.com ,作者@larus。感谢阅读,欢迎点赞,如果你愿意在评论区留言那就更好了。

Sort:  

其实就是SQL注入的问题。

谢谢回复。弄清楚这个问题,感觉整个人都通透了,哈哈,向前辈致敬。

Congratulations @larus! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the total payout received
Award for the number of upvotes

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

Coin Marketplace

STEEM 0.20
TRX 0.13
JST 0.030
BTC 65306.74
ETH 3488.89
USDT 1.00
SBD 2.51