开启左侧

爬虫:新浪微博爬虫的最简单办法

[复制链接]
在线会员 VeUB7M 发表于 2023-1-4 00:27:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
媒介:原文主要实质是介绍怎样用最简朴的法子来收罗新浪微专的数据,主要是收罗指定微专用户公布的微专和微专支到的复兴等外容,能够颠末设置项去调解爬与的微专用户列表和其余属性。
既然道是最简朴的法子,那末咱们便患上先阐发微专爬虫可以挑选的多少个目标网址,起首必然是最多见的web网站了

爬虫:新浪微专爬虫的最简朴法子-1.jpg

另有即是m站,也即是挪动端网页

爬虫:新浪微专爬虫的最简朴法子-2.jpg

和一个没法旧版原的会见进口了,起首能够拂拭web站了,那个是最省事的,它的恳求是被js减稀过,处置起去很省事
这咱们为什么没有进而供其次呢,咱们察看下那个m站的恳求

爬虫:新浪微专爬虫的最简朴法子-3.jpg

能够收现在某个恳求里能够发明咱们需要的微专疑息,既然如许便佳办了,咱们就能够动手咱们的代码了
起首是获得用户疑息,颠末用户疑息获得用户的微专总额,如许就能够明白统共几页的数据了,代码以下所示
  1. def get_json(self, params):
  2.         """获得网页中json数据"""
  3.         url = 'https://m.weibo.cn/api/container/getIndex?'
  4.         r = requests.get(url, params=params, cookies=self.cookie)
  5.         return r.json()
  6.     def get_page_count(self):
  7.         """获得微专页数"""
  8.         try:
  9.             weibo_count = self.user['statuses_count']
  10.             page_count = int(math.ceil(weibo_count / 10.0))
  11.             return page_count
  12.         except KeyError:
  13.             sys.exit(u'法式堕落')
  14.     def get_user_info(self):
  15.         """获得用户疑息"""
  16.         params = {'containerid': '100505' + str(weibo_config['user_id'])}
  17.         js = self.get_json(params)
  18.         if js['ok']:
  19.             info = js['data']['userInfo']
  20.             user_info = {}
  21.             user_info['id'] = weibo_config['user_id']
  22.             user_info['screen_name'] = info.get('screen_name', '')
  23.             user_info['gender'] = info.get('gender', '')
  24.             user_info['statuses_count'] = info.get('statuses_count', 0)
  25.             user_info['followers_count'] = info.get('followers_count', 0)
  26.             user_info['follow_count'] = info.get('follow_count', 0)
  27.             user_info['description'] = info.get('description', '')
  28.             user_info['profile_url'] = info.get('profile_url', '')
  29.             user_info['profile_image_url'] = info.get('profile_image_url', '')
  30.             user_info['avatar_hd'] = info.get('avatar_hd', '')
  31.             user_info['urank'] = info.get('urank', 0)
  32.             user_info['mbrank'] = info.get('mbrank', 0)
  33.             user_info['verified'] = info.get('verified', False)
  34.             user_info['verified_type'] = info.get('verified_type', 0)
  35.             user_info['verified_reason'] = info.get('verified_reason', '')
  36.             user = self.standardize_info(user_info)
  37.             self.user = user
复造代码
分页收罗数据
  1. page1 = 0
  2.         random_pages = random.randint(1, 5)
  3.         self.start_date = datetime.now().strftime('%Y-%m-%d')
  4.         for page in tqdm(range(1, page_count + 1), desc='Progress'):
  5.             is_end = self.get_one_page(page)
  6.             if is_end:
  7.                 break
  8.             if page % 20 == 0:  # 每一爬20页写进一次文献
  9.                 self.weibo_to_mysql(wrote_count)
  10.                 wrote_count = self.got_count
  11.             # 颠末参加随机等候制止被限定。爬虫速率过快简单被体系限定(一段时间后限
  12.             # 造会主动消除),参加随机等候模仿人的操纵,可低落被体系限定的危急。默
  13.             # 认是每一爬与1到5页随机等候6到10秒,假设依旧被限,可恰当增加sleep时间
  14.             if (page - page1) % random_pages == 0 and page < page_count:
  15.                 sleep(random.randint(6, 10))
  16.                 page1 = page
  17.                 random_pages = random.randint(1, 5)
  18.         self.weibo_to_mysql(wrote_count)  # 将盈余不敷20页的微专写进文献
  19.         print(u'微专爬与完毕,同爬与%d条微专' % self.got_count)
复造代码
具体收罗单页微专代码以下
  1. def get_one_page(self, page):
  2.         """获得一页的局部微专"""
  3.         try:
  4.             js = self.get_weibo_json(page)
  5.             if js['ok']:
  6.                 weibos = js['data']['cards']
  7.                 for w in weibos:
  8.                     if w['card_type'] == 9:
  9.                         wb = self.get_one_weibo(w)
  10.                         if wb:
  11.                             if wb['id'] in self.weibo_id_list:
  12.                                 continue
  13.                             created_at = datetime.strptime(
  14.                                 wb['created_at'], '%Y-%m-%d')
  15.                             since_date = datetime.strptime(
  16.                                 self.since_date, '%Y-%m-%d')
  17.                             if created_at < since_date:
  18.                                 if self.is_pinned_weibo(w):
  19.                                     continue
  20.                                 else:
  21.                                     print(u'{}已经获得{}({})的第{}页微专{}'.format(
  22.                                         '-' * 30, self.user['screen_name'],
  23.                                         self.user['id'], page, '-' * 30))
  24.                                     return True
  25.                             if ('retweet' not in wb.keys()):
  26.                                 self.weibo.append(wb)
  27.                                 self.weibo_id_list.append(wb['id'])
  28.                                 self.got_count += 1
  29.             print(u'{}已经获得{}({})的第{}页微专{}'.format('-' * 30,
  30.                                                     self.user['screen_name'],
  31.                                                     self.user['id'], page,
  32.                                                     '-' * 30))
  33.         except Exception as e:
  34.             print("Error: ", e)
  35.             traceback.print_exc()
复造代码
获得具体微专疑息的代码
  1. def get_one_weibo(self, info):
  2.         """获得一条微专的局部疑息"""
  3.         try:
  4.             weibo_info = info['mblog']
  5.             weibo_id = weibo_info['id']
  6.             retweeted_status = weibo_info.get('retweeted_status')
  7.             is_long = weibo_info.get('isLongText')
  8.             if retweeted_status:  # 转收
  9.                 retweet_id = retweeted_status.get('id')
  10.                 is_long_retweet = retweeted_status.get('isLongText')
  11.                 if is_long:
  12.                     weibo = self.get_long_weibo(weibo_id)
  13.                     if not weibo:
  14.                         weibo = self.parse_weibo(weibo_info)
  15.                 else:
  16.                     weibo = self.parse_weibo(weibo_info)
  17.                 if is_long_retweet:
  18.                     retweet = self.get_long_weibo(retweet_id)
  19.                     if not retweet:
  20.                         retweet = self.parse_weibo(retweeted_status)
  21.                 else:
  22.                     retweet = self.parse_weibo(retweeted_status)
  23.                 retweet['created_at'] = self.standardize_date(
  24.                     retweeted_status['created_at'])
  25.                 weibo['retweet'] = retweet
  26.             else:  # 本创
  27.                 if is_long:
  28.                     weibo = self.get_long_weibo(weibo_id)
  29.                     if not weibo:
  30.                         weibo = self.parse_weibo(weibo_info)
  31.                 else:
  32.                     weibo = self.parse_weibo(weibo_info)
  33.             weibo['created_at'] = self.standardize_date(
  34.                 weibo_info['created_at'])
  35.             return weibo
  36.         except Exception as e:
  37.             print("Error: ", e)
  38.             traceback.print_exc()
  39.     def get_long_weibo(self, id):
  40.         """获得少微专"""
  41.         for i in range(5):
  42.             url = 'https://m.weibo.cn/detail/%s' % id
  43.             html = requests.get(url, cookies=self.cookie).text
  44.             html = html[html.find('"status":'):]
  45.             html = html[:html.rfind('"hotScheme"')]
  46.             html = html[:html.rfind(',')]
  47.             html = '{' + html + '}'
  48.             js = json.loads(html, strict=False)
  49.             weibo_info = js.get('status')
  50.             if weibo_info:
  51.                 weibo = self.parse_weibo(weibo_info)
  52.                 return weibo
  53.             sleep(random.randint(6, 10))
复造代码
以上即是中心的微专疑息收罗代码了,除微专疑息,咱们借需要收罗微专批评疑息,道理是一致的,找到数据滥觞

爬虫:新浪微专爬虫的最简朴法子-4.jpg

有了微专疑息收罗的经历,咱们很简单就能够找到咱们念要的谁人交心
具体代码以下
  1. def add_co妹妹ents_json(self,jsondata):
  2.         for data in jsondata:
  3.             item = dict()
  4.             item['id'] = data.get('id')
  5.             item['mid'] = data.get('mid')
  6.             item['like_count'] = data.get("like_count")
  7.             item['source'] = data.get("source")
  8.             item['floor_number'] = data.get("floor_number")
  9.             item['screen_name'] = data.get("user").get("screen_name")
  10.             # 性别
  11.             item['gender'] = data.get("user").get("gender")
  12.             if(item['gender'] == 'm'):
  13.                 item['gender'] = '男'
  14.             elif(item['gender'] == 'f'):
  15.                 item['gender'] = '女'
  16.             item['rootid'] = data.get("rootid")
  17.             item['create_time'] = data.get("created_at")
  18.             import time
  19.             item['create_time'] = time.strptime(item['create_time'], '%a %b %d %H:%M:%S %z %Y')
  20.             item['create_time'] = time.strftime('%Y-%m-%d',item['create_time'])
  21.             item['co妹妹ent'] = data.get("text")
  22.             item['co妹妹ent'] = BeautifulSoup(item['co妹妹ent'], 'html.parser').get_text()
  23.             item['co妹妹ent'] = self.clear_character_chinese(item['co妹妹ent'])
  24.             print('目前楼层{},批评{}'.format(item['floor_number'],item['co妹妹ent']))
  25.             # 批评那条批评的疑息
  26.             co妹妹ents = data.get("co妹妹ents")
  27.             if(co妹妹ents):
  28.                 self.add_co妹妹ents_json(co妹妹ents)
  29.             # print jsondata.dumps(co妹妹ent, encoding="UTF-8", ensure_ascii=False)
  30.             self.co妹妹ents.append(item)
  31.             
  32.     def get_co妹妹ents_page(self,max_id, id_type,mid):
  33.         from get_weibo_cookie import get_cookie
  34.         params = {
  35.             'max_id': max_id,
  36.             'max_id_type': id_type
  37.             }
  38.         try:
  39.             url = 'https://m.weibo.cn/co妹妹ents/hotflow?id={id}&mid={mid}&max_id='
  40.             headers = {
  41.             'Cookie': 'T_WM=96849642965; __guid=52195957.2500582256236055600.1583058027995.9556; WEIBOCN_FROM=1110006030; SCF=Aimq85D9meHNU4Ip0PFUjYBTDjXFB0VtQr3EKoS8DHQDobRNUO3lDIufAcUg69h4J7BQWqryxQpuU3ReIHHxvQ4.; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5H0p180lDMiCjNvXD_-uOh5JpX5KzhUgL.FoM0S0n0eo-0Sh.2dJLoI0qLxKqL1KMLBK-LxK-LBonLBonLxKMLB.-L12-LxK-LBK-LBoeLxK-L1hnL1hqLxKBLB.2LB-zt; XSRF-TOKEN=ca0a29; SUB=_2A25zWlwFDeRhGeFN7FoS8ivPzzWIHXVQpWRNrDV6PUJbkdANLW_9kW1NQ8CH90H5f8j5r1NA4GNPvu6__ERL-Jat; SUHB=0vJIkXXtLIIaZO; SSOLoginState=1583230037; MLOGIN=1; M_WEIBOCN_PARAMS=oid%3D4474164293517551%26luicode%3D20000174%26lfid%3D102803%26uicode%3D20000174; monitor_count=45',
  42.             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
  43.             'X-Requested-With': 'XMLHttpRequest'
  44.         }
  45.             r = requests.get(url.format(id=mid,mid=mid), params=params,headers=headers)
  46.             print(r.url)
  47.             if r.status_code == 200:
  48.                 return r.json()
  49.         except requests.ConnectionError as e:
  50.             print('error', e.args)   
  51.    
  52.     def add_co妹妹ents(self,jsondata):
  53.         datas = jsondata.get('data').get('data')
  54.         for data in datas:
  55.             item = dict()
  56.             item['id'] = data.get('id')
  57.             item['mid'] = data.get('mid')
  58.             item['like_count'] = data.get("like_count")
  59.             item['source'] = data.get("source")
  60.             item['floor_number'] = data.get("floor_number")
  61.             item['screen_name'] = data.get("user").get("screen_name")
  62.             # 性别
  63.             item['gender'] = data.get("user").get("gender")
  64.             if(item['gender'] == 'm'):
  65.                 item['gender'] = '男'
  66.             elif(item['gender'] == 'f'):
  67.                 item['gender'] = '女'
  68.             item['created_at'] = self.standardize_date(
  69.                 data.get(['created_at']))
  70.             import time
  71.             item['create_time'] = time.strptime(item['create_time'], '%a %b %d %H:%M:%S %z %Y')
  72.             item['create_time'] = time.strftime('%Y-%m-%d',item['create_time'])
  73.             item['rootid'] = data.get("rootid")
  74.             
  75.             item['co妹妹ent'] = data.get("text")
  76.             item['co妹妹ent'] = BeautifulSoup(item['co妹妹ent'], 'html.parser').get_text()
  77.             item['co妹妹ent'] = self.clear_character_chinese(item['co妹妹ent'])
  78.             print('目前楼层{},批评{}'.format(item['floor_number'],item['co妹妹ent']))
  79.             # 批评那条批评的疑息
  80.             co妹妹ents = data.get("co妹妹ents")
  81.             # print jsondata.dumps(co妹妹ent, encoding="UTF-8", ensure_ascii=False)
  82.             self.co妹妹ents.append(item)
复造代码
咱们能够检察下收罗到的数据,以下所示

爬虫:新浪微专爬虫的最简朴法子-5.jpg

爬虫:新浪微专爬虫的最简朴法子-6.jpg

残破代码能够来尔的启源名目中检察大概下载,欢送star,大概留行取尔截至交换。
https://gitee.com/chengrongkai/OpenSpiders
原文支收于https://www.bizhibihui.com/blog/article/44

精彩评论9

avatar
在线会员 ECCf2f 发表于 2023-1-4 00:28:39 | 显示全部楼层
大佬,可以帮忙爬取一个评论吗
回复

使用道具 举报

avatar
在线会员 vpbBB 发表于 2023-1-4 00:29:11 | 显示全部楼层
怎么解决需要登录的问题
回复

使用道具 举报

avatar
在线会员 jAwq 发表于 2023-1-4 00:29:34 | 显示全部楼层
爬评论需要登录,登录需要手机验证,怎么解?
回复

使用道具 举报

avatar
在线会员 BXVHG 发表于 2023-1-4 00:29:49 | 显示全部楼层
微博登录问题怎么解决啊,一直没搞定这个
回复

使用道具 举报

avatar
在线会员 CQPs1KQn 发表于 2023-1-4 00:30:06 | 显示全部楼层
感谢
回复

使用道具 举报

avatar
在线会员 5DlYsGu 发表于 2023-1-4 00:30:15 | 显示全部楼层
请问爬取的数据量有多少?一共用了多长时间呢?
回复

使用道具 举报

avatar
在线会员 2I7hqC 发表于 2023-1-4 00:30:29 | 显示全部楼层
国企爬新浪数据用于贸易,会不会呗高?
回复

使用道具 举报

avatar
在线会员 BXVHG 发表于 2023-1-4 00:31:18 | 显示全部楼层
想请问一下可以爬取到每篇微博的阅读数量吗
回复

使用道具 举报

avatar
在线会员 CQPs1KQn 发表于 2023-1-4 00:31:28 | 显示全部楼层
可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )