赞
踩
新手小白,之前爬虫的套路一直是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
待续........
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。