新浪微博小爬虫

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一直琢磨着写个爬虫玩,上学期都没实行,于是花了大概一天写了这个东西。其实半天就把程序调试好了,可是在往mysql数据库里保存数据的时候出了问题。 python的中文编码实在是非常麻烦,不光如此,因为有些用户的简介里有一些特殊符号,®或者笑脸之类的,于是在这里纠结了很久,好歹最后是成功了(其实也就是过...

一直琢磨着写个爬虫玩,上学期都没实行,于是花了大概一天写了这个东西。
__20180816171621

其实半天就把程序调试好了,可是在往mysql数据库里保存数据的时候出了问题。

python的中文编码实在是非常麻烦,不光如此,因为有些用户的简介里有一些特殊符号,®或者笑脸之类的,于是在这里纠结了很久,好歹最后是成功了(其实也就是过滤掉了那些特殊符号)。

效率来说呢,开始的时候一个小时能采集大概1.4w条微博的用户信息,但是由于我是从每个人的关注列表里采集的,所以很快就会遇到爬到许多已经爬过的用户,所以总的来说效率不是很高,怪不得那个“中国爬盟”要发动群众的力量去爬。

而且有些担心爬久了微博账号被封,我也没敢尝试太久,最后爬了5w条用户信息,8w条关系数据,我拿着数据目前也没什么用,所以就这样吧。
1362720354_2319
python没看多久,代码有冗余的地方,其实主要就是三个函数save_user(),creepy_myself(),creepy_others()

具体的就看代码的注释吧

#coding=utf8
 
import urllib2
import re
from BeautifulSoup import *
import MySQLdb
import sys
"""
Login to Sina Weibo with cookie
setdefaultencoding 用于对中文编码的处理
"""
reload(sys)
sys.setdefaultencoding('utf8')  
COOKIE ='你的cookie'
HEADERS = {'cookie': COOKIE}
UID= COOKIE[COOKIE.find('uid')+4:COOKIE.find('uid')+14]
 
'''
    尝试连接数据库,以供保存诗句
'''
try:
    conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='root',db='weibodata',port=3309,charset='utf8',use_unicode=False)
    cur=conn.cursor()
except MySQLdb.Error,e:
    print "Mysql Error %d: %s" % (e.args[0], e.args[1])
 
 
 
def save_user(uuid,uid,name,common):
    '''
        save_user(uuid,uid,name,common)
        用于保存诗句,uuid->uid是用户关系,uuid关注uid
        uid,name,common是将要保存的用户信息
        setup.ini中保存有两个数字
        第一个是now我对当前用户的编号
        第二个point是当前正在扫描的用户的编号
        你可以把它们看作是一个队列的两个指针
    '''
    fileHandle = open ( 'setup.ini','r+');
    now=int(fileHandle.readline())+1;
    point =int(fileHandle.readline())
    print now
    #print uuid,uid,name,common
    #保存用户关系信息
    count=cur.execute('select * from relations where uid1=\''+str(uuid)+'\' and uid2=\''+str(uid)+'\'')
    if (count==0):
           
            cur.execute('insert into relations(uid1,uid2)values(\''+\
                        str(uuid)+'\',\''+str(uid)+'\')')
            conn.commit()
 
    count=cur.execute('select * from users where uid=\''+str(uid)+'\'')
    #保存用户信息
    if (count==0):
            cs=common.encode('gbk', 'ignore').decode('gbk', 'ignore').encode('utf-8', 'ignore')
  
            #print cs
            cur.execute('insert into users(id,uid,name,common)values(\''+\
                        str(now)+'\',\''+str(uid)+'\',\''+str(name)+'\',\"'+\
                        cs +\
                        '\")')
            conn.commit()
            fileHandle.close()
            fileHandle = open ( 'setup.ini','w');
            fileHandle.write(str(now)+'\n'+str(point))
     
    fileHandle.close()
 
def creepy_myself():
    '''
        这是用来扫描你自己的关注列表的
        我想着得有个开头,所以第一次使用时应调用这个函数为队列添加一些用户再作扩展
    '''
    uid= COOKIE[COOKIE.find('uid')+4:COOKIE.find('uid')+14]
    url = 'http://weibo.com/'+str(uid)+'/myfollow?t=1&page=1'
    mainurl='http://weibo.com/'+str(uid)+'/myfollow?t=1&page='
    req = urllib2.Request(url, headers=HEADERS)
    text = urllib2.urlopen(req).read()
    mainSoup=BeautifulSoup(text)
    strs=str(mainSoup.find('div','lev2'));
    num=int(strs[strs.find('(')+1:strs.find(')')])
 
    lines=text.splitlines()  
    for line in lines:
         if line.startswith('<script>STK && STK.pageletM && STK.pageletM.view({"pid":"pl_relation_myf'):
            n = line.find('html":"')  
            if n > 0:  
                j = line[n + 7: -12].replace("\\", "")  
                soup =BeautifulSoup(j)
                follows=soup.findAll('div','myfollow_list S_line2 SW_fun')
                for follow in follows:
                    namess=follow.find('ul','info').find('a')['title']
                    temp_str=str(follow)
                    uiddd= temp_str[temp_str.find('uid')+4:temp_str.find('&')]
                    save_user(UID,uiddd,namess,follow.find('div','intro S_txt2').contents[0][6:])
                     
    for i in range(2,num/30+1):
        url = 'http://weibo.com/2421424850/myfollow?t=1&page='+str(i)
        req = urllib2.Request(url, headers=HEADERS)
        text = urllib2.urlopen(req).read()
 
 
        lines=text.splitlines()  
        for line in lines:
         if line.startswith('<script>STK && STK.pageletM && STK.pageletM.view({"pid":"pl_relation_myf'):
            n = line.find('html":"')  
            if n > 0:  
                j = line[n + 7: -12].replace("\\", "")  
                soup =BeautifulSoup(j)
                follows=soup.findAll('div','myfollow_list S_line2 SW_fun')
                for follow in follows:
                    namess=follow.find('ul','info').find('a')['title']
                    temp_str=str(follow)
                    uiddd =temp_str[temp_str.find('uid')+4:temp_str.find('&')]
                    save_user(UID,uiddd,namess,follow.find('div','intro S_txt2').contents[0][6:])
 
                    
                     
def creepy_others(uid):
    '''
        扫描制定uid用户的信息
        和上面一样代码有冗余
        因为要先得到这个用户的关注人数,来计算一共有多少页数据
    '''
    url="http://weibo.com/"+str(uid)+"/follow?page=";
    req = urllib2.Request(url, headers=HEADERS)
    text = urllib2.urlopen(req).read()
 
    
    mainSoup=BeautifulSoup(text.strip())
    lines=text.splitlines()
    num=1
    for line in lines:
         if line.startswith('<script>STK && STK.pageletM && STK.pageletM.view({"pid":"pl_relation_hisFollow'):
            n = line.find('html":"')
            if n > 0:  
                j = line[n + 7: -12].replace("\\n", "")
                j = j.replace("\\t","")
                j = j.replace("\\",'');
                soup=BeautifulSoup(j)
                strs=str(soup.find('div','patch_title'))
                num=int(strs[strs.find('关注了')+9:strs.find('人</div')]);
                follows=soup.findAll('li','clearfix S_line1')
                for follow in follows:
                    temp_str=str(follow)
                   # print temp_str
                    temp_uid=temp_str[temp_str.find('uid'):temp_str.find('&')];
                    temp_soup=BeautifulSoup(temp_str);
                    temp_fnick=temp_soup.find('div').find('a')['title']
                    save_user(uid,temp_uid[4:],temp_fnick,str(temp_soup.find('div','info'))[18:-6]);
 
                #print num/20+2
                for i in range(2,num/20+1):
                     urls="http://weibo.com/"+str(uid)+"/follow?page="+str(i);
                     req = urllib2.Request(urls, headers=HEADERS)
                     text = urllib2.urlopen(req).read()
                     lines=text.splitlines()
                     for line in lines:
                        if line.startswith('<script>STK && STK.pageletM && STK.pageletM.view({"pid":"pl_relation_hisFollow'):
                            n = line.find('html":"')
                            if n > 0:  
                                j = line[n + 7: -12].replace("\\n", "")
                                j = j.replace("\\t","")
                                j = j.replace("\\",'');
                                soup=BeautifulSoup(j)
                                strs=str(soup.find('div','patch_title'))
                                num=int(strs[strs.find('关注了')+9:strs.find('人</div')]);
                                follows=soup.findAll('li','clearfix S_line1')
                                for follow in follows:
                                    temp_str=str(follow)
                                   # print temp_str
                                    temp_uid=temp_str[temp_str.find('uid'):temp_str.find('&')];
                                    temp_soup=BeautifulSoup(temp_str);
                                    temp_fnick=temp_soup.find('div').find('a')['title']
                                    save_user(uid,temp_uid[4:],temp_fnick,str(temp_soup.find('div','info'))[18:-6]);
                       
                                   
 
              
if __name__ == '__main__':
    #save_user('123','123','ads','212332231')
    #creepy_myself()
    '''
        虽然很谨慎地处理了中文编码,但每过一段时间还是会有一些问题
        于是抛掉了所有异常,防止程序中断
    '''
    while(1):
        '''
            首先取得队列的尾指针,也就是point
            根据point从数据库中找到uid,然后creepy_others(uuid)
        '''
        fileHandle = open ( 'setup.ini','r+');
        now=int(fileHandle.readline());
        point =int(fileHandle.readline())+1;
        fileHandle.close()
        fileHandle = open ( 'setup.ini','w');
        fileHandle.write(str(now)+'\n'+str(point))
        fileHandle.close()
        cur.execute('select uid from users where id=\''+str(point)+'\'')
        uuid=cur.fetchone()[0];
        if len(uuid)==10:
            try:
                creepy_others(uuid)
            except Exception , e:
                pass
    
    cur.close()
    conn.close()
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
数据采集 NoSQL Redis
新浪微博爬虫最新分享
前言: 更新完《QQ空间爬虫分享(2016年11月18日更新)》(http://blog.csdn.net/bone_ace/article/details/53213779) 现在将新浪微博爬虫的代码也更新一下吧。
1779 0
|
数据采集 Python
python3 asyncio异步新浪微博爬虫WeiboSpider
使用python 异步io开发的新浪微博爬虫,基于aiohttp。
3881 0
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
89 6
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
209 4
|
4月前
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。
|
5月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
87 4
|
2月前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
202 66
|
1月前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
1月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
65 4
|
2月前
|
数据采集 JavaScript 前端开发
JavaScript逆向爬虫——使用Python模拟执行JavaScript
JavaScript逆向爬虫——使用Python模拟执行JavaScript
37 2