本次活动预备知识贴:天罗地网——Python爬虫初初初探
http://blog.csdn.net/eclipsexys/article/details/48193541
请一定先了解下,不然就真的是为了抽奖了!
我的新书《Android群英传》上市不久,为了回报各位的大力推荐,也希望更多的人能多多支持,特准备此次抽奖活动。
只要在本博客中留言,即可参与抽奖活动。
留言内容如下:
PS 请不要重复评论,虽然可以增加我的人气,但对抽奖概率,不会有丝毫影响哦。
PS 请不要欺骗医生真挚纯洁真诚善良的心!
PS 如果你不要我的书也不要我的补贴,但是你却中奖了,那请你直接来上海,浦软大厦703,我!请!你!吃!食!堂!。
写书不易,一本书我只赚4块钱,请大家本着社会主义的核心价值观,请不要欺骗我真挚的感情~~~~
(comments / 40) + 1
抽奖时间,暂定于2015年9月25日中秋前夕。希望给大家带来一份不错的中秋礼物。
下面是技术帖下面是技术帖下面是技术帖下面是技术帖
抽奖的方式很简单,统计所有的有限留言,获取他们的用户名,通过随机数来确定中奖的人的用户名。
作为一个技术宅,我当然不想自己去统计,能自动化的就不要用女朋友,能写脚本的就不用女朋友。所以,本博客的实际目的在于教大家如何正确的去使用女朋友,哦,不对,是正确的使用脚本。
首先我们来看CSDN博客的评论系统。
哎呀我真不是故意截这么多赞美的,请无视。
我们打开Chrome的审核元素:
用放大镜找到用户名:
然后点击右键去找源代码,可是,我们突然发现,不对呀,源代码中根本就没有这些评论信息啊。
哦,这样应该也对,评论的加载,应该是用ajax的吧,不然我们每次评论后,肯定会刷新整个页面咯。
OK,那么我们就来到Network标签,刷新页面,获取数据:
显示评论所调用的js,就在这些文件当中,我们慢慢找吧。
首先,我们尝试着先过滤几个关键字,比如 comment:
哎哟不错哦,第一个链接看上次嫌疑很大啊,点击右键,新窗口打开:
看来,英语好的人运气都不会太差。
这样我们就非常简单的获取了获得评论的地址:
http://blog.csdn.net/eclipsexys/comment/list/47405045?page=1
从URL可以看出来,只是加了个用户名作区分。
OK,下面我们可以通过:
还爬什么爬,直接请求这个接口,咱们就拿到这些数据了,所以,前面说的本篇的预备帖,好吧,其实是骗流量的。
实现就非常简单了,尼玛,接口都有了,拿了数据,去除重复评论的、无效的评论、回复的评论,剩下的就是有效数据了。
上Python,让看了预备帖的人不至于扫兴而归:
# coding:utf-8
import requests
import json
import random
class Prize(object):
def __init__(self):
print u'开始抽奖啦'
# 获取网页信息
def getSource(self, url):
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
html = requests.get(url, headers=head)
html.encoding = 'utf-8'
return html.text
# 获取所有评论信息
def getAllCommentInfo(self, source):
return json.loads(source)['list']
# 保存到文件
def saveinfo(self, commentInfo):
f = open('info.txt', 'w')
for each in commentInfo:
print each
f.writelines('UserName:' + each + '\n')
f.close()
if __name__ == '__main__':
# 设定获奖人数
winnerCount = 1
userList = []
url = "http://blog.csdn.net/eclipsexys/comment/list/47405045?page=1"
androidHeros = Prize()
html = androidHeros.getSource(url)
commentsInfo = androidHeros.getAllCommentInfo(html)
for each in commentsInfo:
if '[reply]' not in each['Content'] and each['UserName'] not in userList:
userList.append(each['UserName'])
androidHeros.saveinfo(userList)
for i in range(0, winnerCount):
randomNum = random.randint(0, userList.__len__())
winner = userList[randomNum]
print '\n-------------------Winner : ' + winner + ' -------------------'
技术,是为了实现实际的目的,这个世界上没有最好的语言,只有最适合的语言,请用最合适的语言去做最合适的事,拒绝做一个语言喷子,从你我他做起。 ——有感于某群中为了争论爬虫为什么不用Java写的人
即将到来,请大家奔走相告,开始留言吧,评论的人,运气一般都不会太差。