爬虫目标
通过微博话题获取发帖的信息与用户基本信息,数据可用于该话题的用户分析。
爬取字段:账号id号、昵称、关注数、粉丝数、微博数、个性签名、账号类型、等级、简介、使用设备
所用到模块:requests、lxml、re
说明:无登录爬取微博用户数据,实现 自动获取Cookie和Cookie失效自动更新,还有其他技巧,自己看。
爬虫结构
class WeiBoSpider(): def __init__(self): # 起始地址 self.url = "https://s.weibo.com/weibo?q=%23%E8%94%A1%E5%BE%90%E5%9D%A4%E7%82%B9%E8%AF%84%23&Refer=top" # cookie self.cookie = self.get_cookie() # 获取所有数据 def get_data(self): pass # 通过 id 获取用户信息 def get_user_data(self,user_id): pass # 获取 & 更新 Cookie def get_cookie(self): passif __name__ == '__main__': wbs = WeiBoSpider() wbs.get_data()
获取所有数据
def get_data(self): r = requests.get(url=self.url) html = etree.HTML(r.text) # 接信息网页 userdatas_list = html.xpath('//div[@id="pl_feedlist_index"]/div/div[@action-type="feed_list_item"]') # 获取数据 users_list = list() for userdata in userdatas_list: # 昵称 nick_name = userdata.xpath('.//div[@class="info"]/div[2]/a/@nick-name') # 个人页 user_id = re.search(r'/(d*?)?',userdata.xpath('.//div[@class="info"]/div[2]/a[1]/@href')[0]).group(1) # 账号类型 user_type = userdata.xpath('.//div[@class="info"]/div[2]/a[2]/@title') # 使用设备 equipment = userdata.xpath('.//p[@class="from"]/a[2]/text()') # 组合数据 data = { "nick_name":nick_name, "user_id": user_id, "user_type":user_type, "equipment":equipment, # 调用函数获取用户信息 "user_data": self.get_user_data(user_id), } print(data) users_list.append(data) return users_list
通过ID用户信息
获取用户信息时,就对Cookie有着严格的要求,但是我们实现了自动化获取Cookie。
def get_user_data(self,user_id = "2803301701"): user_url = "https://weibo.com/u/{}".format(user_id) headers = { "Content-Type": "text/html; charset=utf-8", "Host": "weibo.com", } r = requests.get(url=user_url,headers=headers,cookies=self.cookie) # 判断cookie的有效性 if r.text == " ": r = requests.get(url=user_url, headers=headers, cookies=self.get_cookie()) # 个人签名 try: user_sign = re.search(r"简介:(.*?)",r.text).group(1).replace("","").strip() except AttributeError: user_sign = " " # 关注 concern = re.search(r'">(d*?)关注',r.text).group(1) # 粉丝 fans = re.search(r'">(d*?)粉丝',r.text).group(1) # 微博数量 weibo_count = re.search(r'">(d*?)微博',r.text).group(1) return {"user_sign":user_sign,"concern":concern,"fans":fans,"weibo_count":weibo_count}
Cookie 获取 & 更新
在爬取微博用户数据遇到困难的朋友可以参考以下。
def get_cookie(self): s = requests.session() # 获取第一个 Cookie s.get("https://passport.weibo.com/visitor/visitor") # 获取 tid 参数 tid_ = s.post(url="https://passport.weibo.com/visitor/genvisitor", data={ "cb": "gen_callback", "fp": {} }) tid = re.search(r'{"tid":"(.+?)"', tid_.text).group(1) # 返回需要的所有 Cookie r = s.get(url="https://passport.weibo.com/visitor/visitor", params={ "a": "incarnate", "t": tid, "cb": "cross_domain", }) cookies = r.cookies try: cookies["SRT"] except KeyError: print("获取cookie失败,真正重新获取") return self.get_cookie() else: self.cookie = cookies print(self.cookie) return cookies
运行结果
暂没有翻页功能,看后面补充吧!!!