当前位置:   article > 正文

用PYTHON的requests库和re库抓取博主粉丝ID号_微博抓取用户id python

微博抓取用户id python

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

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

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

1.需要登录的状态

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

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

  1. def gethtmlwithcookie(url):
  2. cookies = {'cookie':'用开发者工具查看到的你的cookies'}
  3. 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'}
  4. timeout = 10
  5. r = requests.get(url, headers=headers,cookies = cookies,timeout=timeout)
  6. r.encoding = 'utf-8'
  7. return r.text

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

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



现在来看具体的

  1. #zhe
  2. def gethtmlwithcookie(url):
  3. 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'}
  4. 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'}
  5. timeout = 10
  6. r = requests.get(url, headers=headers,cookies = cookies,timeout=timeout)
  7. r.encoding = 'utf-8'
  8. return r.text
  1. #我的目的是获取 搜索关键词相关人后得到的博主的信息,这个函数用户得到博主的ID
  2. #通过分析源代码,发现博主的ID在源代码中的形式是 /.IDrefer_flag=1001030201_
  3. #所以用正则表达式将源代码中所有的形式内容抓取出来,以list形式保存
  4. #因为可能会多抓,所以要过滤掉,我在操作过程中发现'follow','fans','profile'是错误抓取的,所以就过滤了,这个过程可能需要具体问题具体研究
  5. def getUSERlink(url):
  6. response = gethtmlwithcookie(url)
  7. r = re.compile(r'/.{5,15}?refer_flag=1001030201_')
  8. x = r.findall(str(response))
  9. regx = re.compile(r'/[\da-zA-z]*\?refer')
  10. y = []
  11. idtem = []
  12. for i in x:
  13. y.append(regx.findall(str(i))[0])
  14. for i in y:
  15. idtem.append(i.rstrip('refer').rstrip('?').lstrip('/'))
  16. idtem = list(set(idtem))
  17. stopword = ['follow','fans','profile']
  18. for i in stopword:
  19. if i in idtem:
  20. idtem.remove(i)
  21. return idtem
  1. #接下来是进行多页抓取,因为第一页和后几页的链接有点不一样,所以分开讨论,一般链接的分页都是通过链接的page参数控制的
  2. #depth是抓取的页数
  3. def getMERCHANTid(depth):
  4. url1 = 'http://s.weibo.com/user/%25E5%25A9%259A%25E7%25BA%25B1%25E6%2591%2584%25E5%25BD%25B1&Refer=weibo_user'
  5. url2 = 'http://s.weibo.com/user/%25E5%25A9%259A%25E7%25BA%25B1%25E6%2591%2584%25E5%25BD%25B1&page='
  6. merchant_id = []
  7. for i in np.arange(depth):
  8. if i == 0 :
  9. response = getUSERlink(url1)
  10. else:
  11. response = getUSERlink(url2 + str(i+1))
  12. merchant_id.extend(response)
  13. return merchant_id
  1. #这是用于抓取博主粉丝ID
  2. #同样分析博主粉丝页的源代码,发现粉丝的ID存在于 href=IDrefer_flag=1005050008_ 的形式
  3. def get_fanlink(url):
  4. import re
  5. res_fanlink = gethtmlwithcookie(url)
  6. reg = re.compile(r'href=[\S]*?refer_flag=1005050008_')
  7. fanlink = reg.findall(str(res_fanlink))
  8. fan_linktem = []
  9. fan_link = []
  10. reg1 = re.compile(r'/[\w]*?\?')
  11. for i in fanlink:
  12. fan_linktem.append(reg1.findall(i))
  13. for i in fan_linktem:
  14. fan_link.append(i[0].lstrip('/').rstrip('?'))
  15. fan_link = list(set(fan_link))
  16. return fan_link
  1. #这是抓取博主粉丝的主函数
  2. if __name__=='__main__':
  3. n_1 = 3 #要爬取的博主页数
  4. merchant = getMERCHANTid(n_1)
  5. n_2 = 4 #要爬取的粉丝页数
  6. result_fan = []
  7. for j in np.arange(n_2):
  8. for i in merchant:
  9. url = 'https://weibo.com/'+i+'/fans?refer_flag=1001030201_&page='+str(j+1)
  10. res = get_fanlink(url)
  11. result_fan.extend(res)
  12. time.sleep(1.5)
  13. result_fan = list(set(result_fan))
  14. write_result('fans_page5',result_fan)


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

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

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

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

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

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

待续........


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/56783
推荐阅读
相关标签
  

闽ICP备14008679号