【爬虫项目】爬取微博话题下的用户数据

爬虫目标

通过微博话题获取发帖的信息用户基本信息,数据可用于该话题的用户分析。

爬取字段:
账号id号昵称关注数粉丝数微博数个性签名账号类型等级简介使用设备

所用到模块:requestslxmlre

mark

说明:

无登录爬取微博用户数据,实现 自动获取CookieCookie失效自动更新,还有其他技巧,自己看。

爬虫结构

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):
        pass

if __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"简介:(.*?)<\\/span>",r.text).group(1).replace("\\t","").strip()
    except AttributeError:
        user_sign = " "
    # 关注
    concern = re.search(r'">(\d*?)<\\/strong><span class=\\"S_txt2\\">关注',r.text).group(1)
    # 粉丝
    fans = re.search(r'">(\d*?)<\\/strong><span class=\\"S_txt2\\">粉丝<\\/span>',r.text).group(1)
    # 微博数量
    weibo_count = re.search(r'">(\d*?)<\\/strong><span class=\\"S_txt2\\">微博',r.text).group(1)

    return {"user_sign":user_sign,"concern":concern,"fans":fans,"weibo_count":weibo_count}

在爬取微博用户数据遇到困难的朋友可以参考以下

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

运行结果

暂没有翻页功能,看后面补充吧!!!

mark

发表评论 / Comment

用心评论~

金玉良言 / Appraise
微年*LV 1
2022-01-15 19:26
你好,请问可以求一份源码嘛?
头像
明妃LV 2
2022-01-15 19:29
@微年*:源码贴出来的