19年深圳杯D题之爬取微博粉丝基本信息

匿名 (未验证) 提交于 2019-12-02 23:32:01

前言

由于第一问需要频道用户信息,便选择从深圳卫视的微博中爬取其粉丝的信息作为数据。

网站分析

首先分析微博粉丝列表,获取每个粉丝的id,可用地址栏的page参数进行翻页,


在用户信息部分,有两个需要注意的地方:一个是id会拼在一个数字的后面,我这里的id前就有100505,这个数字不固定,大家之后运行的话一定要记得修改;另外一个是有些用户的基本信息不全,爬取的时候需要加上过滤条件。


总的来讲思路就是在微博粉丝列表的界面获取粉丝的id,再根据id来爬取每个粉丝的基本信息。

具体代码

解决登录

def get_userids(targetId, fileName):     browser = webdriver.Chrome()     browser.get('https://weibo.com')     # 先手动登录,保存一下cookies     time.sleep(60)     write_cookies(browser.get_cookies())     browser.delete_all_cookies()     # 获取保存的cookies     cookies = get_cookies_list()     # 设置cookie再打开首页可以看到是已登录状态     for item in cookies:         browser.add_cookie(item)     browser.get('https://weibo.com') 

其中用到两个我以前封装的工具方法

def write_cookies(cookies):     cookiesJson = json.dumps(cookies)     with open('taobao.json', 'w') as f:         f.write(cookiesJson) def get_cookies_list():     with open('taobao.json', 'r', encoding='utf-8') as f:         cookiesList = json.loads(f.read())         return cookiesList 

获取id

def get_userids(targetId, fileName):     '''     :param userids: 我这里采取的是根据id,来确定需要爬取的微博对象,简单修改一下代码也可以直接写链接。     :param fileName: 直接将id写入文件保存下来     :return: 没有返回值     '''     browser = webdriver.Chrome()     browser.get('https://weibo.com')     browser.delete_all_cookies()     # 获取保存的cookies     cookies = get_cookies_list()     for item in cookies:         browser.add_cookie(item)     for i in range(1, 6):         # url = 'https://weibo.com/p/100106'+str(targetId)+'/follow?relate=fans&page='+str(i)+'#Pl_Official_HisRelation__47'         url = 'https://weibo.com/p/100606'+str(targetId)+'/follow?relate=fans&page='+str(i)+'#Pl_Official_HisRelation__47'         # url = 'https://weibo.com/p/100206'+str(targetId)+'/follow?pids=Pl_Official_HisRelation__50&relate=fans&page='+str(i)+'#Pl_Official_HisRelation__50'         browser.get(url)         html = browser.page_source         doc = pq(html)         userlist = doc.find('.info_name .S_txt1')	# CSS选择器,时间长了可能会变         for user in userlist.items():             item = str(user.attr('href'))             userid = re.findall("u/(.+)\?", item)             with open('ids/audience/'+fileName, 'a') as f:		# 保存文件的名字                 if len(userid) > 0:                     f.write(str(userid[0]) + '\n') 

获取信息

def get_info(userids, fileName):     '''         :param userids: 之前爬取的用户id     :param fileName: 用于存储基本信息的文件,采用csv格式,一个用户一行:用户名,地区,性别、生日     :return: 无返回值     '''     browser = webdriver.Chrome()     browser.get('https://weibo.com')     browser.delete_all_cookies()     cookies = get_cookies_list()     # 设置cookie再打开首页可以看到是已登录状态     for item in cookies:         browser.add_cookie(item)     for userid in userids:         url = 'https://weibo.com/p/100505'+str(userid)+'/info?mod=pedit_more'         browser.get(url)         html = browser.page_source         doc = pq(html)         basic = doc.find('.WB_innerwrap .clearfix .li_1 .pt_detail')			# CSS选择器,时间长了可能会变         count = 1         line = []         for item in basic.items():             if count <= 4:						# 只取前四个                 line.append(item.text())                 count = count+1             else:                 break         write_info(line, fileName, userid)     browser.close() 

其中将写信息的操作单独进行了封装

def write_info(line, fileName, userid):     with open('infos/product/'+fileName, 'a') as f:         if len(line) == 4 and str(line[2]) in '男,女' and '年' in str(line[3]) and '月' in str(line[3]):             f.write(str(userid) + ',' + str(line[1]) + ',' + str(line[2]) + ',' + str(line[3]) + '\n') 

调用演示

if __name__ == '__main__':      names = ['深圳卫视诗意中国栏目', '深圳卫视探秘时刻栏目', '深圳卫视微博发布厅', '深圳卫视温暖在身边栏目', '深圳卫视正午三十分栏目', '深圳卫视直播港澳台栏目']     for name in names:         ids = read_ids(name+'粉丝id列表.txt')         get_info(ids, name+'粉丝信息列表.csv') 

其中封装了一个读取id的方法

def read_ids(fileName):     ids = []     with open('ids/product/'+fileName) as f:         for line in f:             ids.append(line.strip())     return ids 
文章来源: https://blog.csdn.net/weixin_44112790/article/details/89929814
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!