前言
由于第一问需要频道用户信息,便选择从深圳卫视的微博中爬取其粉丝的信息作为数据。
网站分析
首先分析微博粉丝列表,获取每个粉丝的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