这两天写了一个Python爬虫脚本,用来爬取游戏社区Taptap的用户评论数据,希望在之后对游戏玩家的口味、调性、喜好等做一些细致的分析。
简单介绍一下这个爬虫。
这个爬虫采用的是经典的python爬虫框架Scrapy,我大概花了4个小时的时间来构建爬虫程序,整个工作流程为:
这个爬虫的爬取速度还是比较令我满意的。经过实际测试,在正常的办公网络环境下,平均每秒可以抓取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。感谢阅读,欢迎点赞,如果你愿意在评论区留言那就更好了。