用PYTHON的requests库和re库抓取博主粉丝ID号

本文介绍了一种使用Python爬取微博信息的方法,包括利用requests和正则表达式抓取数据,解决登录状态和非同步加载问题,以及多页抓取等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新手小白,之前爬虫的套路一直是requests-beautifulsoup结合,这次尝试抓取微博信息发现了一些与之前不同的问题。在爬虫过程中,发现requests.get()回来的信息用beautifulsoup解析不出来,一查网页源代码跟之前抓取的不太一样。现在也还没去认真思考这个问题,有了解的可以交流交流....当时索性跳过beautifulsoup解析,直接用正则表达式抓取源码的内容,顿时体会到了正则表达式的强大。

本文的主要思路是,先用关键词查找人,然后抓取结果博主ID,接着抓取每个博主的最新粉丝ID,最后抓取与博主互动的粉丝ID

抓取微博信息有几点需要注意的。

1.需要登录的状态

2.非同步载入问题,微博一页的信息内容可能要加载2-3次才能加载完,而未加载的内容用简单的requests.get是得不到的。

解决问题1,获取登录状态最简便的就是用从浏览器获取cookies,直接复制作为requests.get()的cookies参数

def gethtmlwithcookie(url):
    cookies = {'cookie':'用开发者工具查看到的你的cookies'}
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
    timeout = 10
    r = requests.get(url, headers=headers,cookies = cookies,timeout=timeout)
    r.encoding = 'utf-8'
    return r.text

解决问题2,非同步载入问题

用开发者工具检查XHR下的链接,找到包含自己想要的内容的链接,然后对链接进行requests.get。



现在来看具体的

#zhe
def gethtmlwithcookie(url):
    cookies = {'cookie':'SINAGLOBAL=8920894244907.684.1529563536809; UOR=,,login.sina.com.cn; un=18811742806; wvr=6; _T_WM=fae2790fa924e9ef7b012929f4a370fe; SSOLoginState=1529729114; SCF=AqK9PIoEV_8-x7i-NLGIVhor7rfMHUjkoUDaDs2-KcTKv6Gy_kkPYsofCN9juzU_whkhpDG2GgpqC7ybaDD9K2E.; SUB=_2A252KaALDeRhGeNO41QX8CfEwz-IHXVVXpbDrDV8PUNbmtBeLXXTkW9NTtnx52R-ewEMaCt4ZVcULTl_YXWXofZ_; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WhCWMwCfdn3SELnse-sxsnQ5JpX5KMhUgL.Fo-71hqceh.R1he2dJLoI7HeK2DDeBtt; SUHB=0sqBHz2tCMOCbk; ALF=1561265113; _s_tentry=-; Apache=422655386125.9008.1529725443315; ULV=1529725443342:4:4:4:422655386125.9008.1529725443315:1529630805889; WBStorage=5548c0baa42e6f3d|undefined'}
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
    timeout = 10
    r = requests.get(url, headers=headers,cookies = cookies,timeout=timeout)
    r.encoding = 'utf-8'
    return r.text
#我的目的是获取 搜索关键词相关人后得到的博主的信息,这个函数用户得到博主的ID
#通过分析源代码,发现博主的ID在源代码中的形式是  /.IDrefer_flag=1001030201_
#所以用正则表达式将源代码中所有的形式内容抓取出来,以list形式保存
#因为可能会多抓,所以要过滤掉,我在操作过程中发现'follow','fans','profile'是错误抓取的,所以就过滤了,这个过程可能需要具体问题具体研究

def getUSERlink(url):
    response = gethtmlwithcookie(url)
    r = re.compile(r'/.{5,15}?refer_flag=1001030201_')
    x = r.findall(str(response))
    regx = re.compile(r'/[\da-zA-z]*\?refer')
    y = []
    idtem = []
    for i in x:
        y.append(regx.findall(str(i))[0])
    for i in y:
        idtem.append(i.rstrip('refer').rstrip('?').lstrip('/'))
    idtem = list(set(idtem))
    stopword = ['follow','fans','profile']
   
    for i in stopword:
        if i in idtem:
            idtem.remove(i)
    return idtem
#接下来是进行多页抓取,因为第一页和后几页的链接有点不一样,所以分开讨论,一般链接的分页都是通过链接的page参数控制的
#depth是抓取的页数
def getMERCHANTid(depth):
    url1 = 'http://s.weibo.com/user/%25E5%25A9%259A%25E7%25BA%25B1%25E6%2591%2584%25E5%25BD%25B1&Refer=weibo_user'
    url2 = 'http://s.weibo.com/user/%25E5%25A9%259A%25E7%25BA%25B1%25E6%2591%2584%25E5%25BD%25B1&page='
    
    merchant_id = []
    for i in np.arange(depth):
        if i == 0 :
            response = getUSERlink(url1)
        else:
            response = getUSERlink(url2 + str(i+1))
        merchant_id.extend(response)
    return merchant_id
#这是用于抓取博主粉丝ID
#同样分析博主粉丝页的源代码,发现粉丝的ID存在于 href=IDrefer_flag=1005050008_ 的形式

def get_fanlink(url):
    import re    
    res_fanlink = gethtmlwithcookie(url)
    reg = re.compile(r'href=[\S]*?refer_flag=1005050008_')
    fanlink = reg.findall(str(res_fanlink))
    fan_linktem = []
    fan_link = []
    reg1 = re.compile(r'/[\w]*?\?')
    for i in fanlink:
        fan_linktem.append(reg1.findall(i))
    for i in fan_linktem:
        fan_link.append(i[0].lstrip('/').rstrip('?'))
    fan_link = list(set(fan_link))
    return fan_link
#这是抓取博主粉丝的主函数
if __name__=='__main__':
    n_1 = 3                         #要爬取的博主页数
    merchant = getMERCHANTid(n_1)   
    n_2 = 4                       #要爬取的粉丝页数
    result_fan = []
    for j in np.arange(n_2):
        for i in merchant:
            url = 'https://weibo.com/'+i+'/fans?refer_flag=1001030201_&page='+str(j+1)
            res = get_fanlink(url)
            result_fan.extend(res)
            time.sleep(1.5)
    result_fan = list(set(result_fan))
    write_result('fans_page5',result_fan)


接下来是抓取每篇博文的互动粉丝。能力不足,没法抓取网页版的,只能用移动版的。

先研究每篇博文的链接,发现博文链接可以从下面形式构成

https://m.weibo.cn/博主ID/博文编码?type=comment

如  uid = '2408764982',pid = 'GmwL2fV5F'

所以获得博主ID和博文编码就可以获得所有想要的互动页了,之后只需要把type改了,也可以获得转发,点赞,评论的情况了。我们之前已经获得了博主的ID,不过有些ID不是数字ID,在这用不了,所以得重新抓取博主ID

#这是用于获取博主ID和博文ID的函数,同样是观察源代码,写re表达式
def get_pid(url):   #获取微博的pid
    r = gethtmlwithcookie(url)
    reg = re.compile(r'\[\'oid\'\]=\'[\d]{8,10}\'')
    uid = reg.findall(r)[0].lstrip("['oid']='").rstrip("'")
    reg = re.compile(r'\[\'page_id\'\]=\'[\d]{5,30}\'') 
    pid = reg.findall(r)[0].lstrip("['page_id']='").rstrip("'")
    return uid,pid

待续........


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值