爬取个人微博

时间:2022-01-25 21:30:02

源代码:

  1. from urllib.parse import urlencode  
  2. import requests  
  3.     
  4. base_url = 'https://m.weibo.cn/api/container/getIndex?'  
  5.     
  6. 构造headers  
  7. headers = {  
  8.     'Host''m.weibo.cn',  
  9.     # HTTP来源地址(referer,或 HTTP referer)是HTTP表头的一个字段,用来表示从哪儿链接到目前的网页,  
  10.     采用的格式是URL。换句话说,借着HTTP来源地址,目前的网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。  
  11.     'Referer''https://m.weibo.cn/u/2830678474',  
  12.     'User-Agent'"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 "  
  13.                     "(KHTML, like Gecko, Safari/419.3)Arora/0.3 (Change: 287 c9dfb30)",  
  14.     可以利用它,request.getHeader("x-requested-with");  null,则为传统同步请求,为 XMLHttpRequest,则为 Ajax 异步请求。  
  15.     'X-Requested-With''XMLHttpRequest'  
  16. }  
  17.     
  18. def get_page(page):  
  19.     创建请求参数  
  20.     params = {  
  21.         'type''uid',  
  22.         'value''2830678474',  
  23.         'containerid''1076032830678474',  
  24.         'page': page  
  25.     }  
  26.     url = base_url + urlencode(params)  
  27.     try:  
  28.         response =requests.get(url, headers = headers)  
  29.         if response.status_code == 200:  
  30.             return response.json()  
  31.     except requests.ConnectionError as e:  
  32.         print('Error', e.args)  
  33.     
  34.     
  35. from pyquery import PyQuery as pq  
  36.     
  37. def parse_page(json):  
  38.     if json:  
  39.         items = json.get('data').get('cards')  
  40.         for item in items:  
  41.             item = item.get('mblog')  
  42.             实际分析过程中发现部分 item 并没有 mblog, 浏览器实际页面也不显示这些item 所以增加一个判断,去除无效的 item  
  43.             if item:  
  44.                 print(item)  
  45.                 weibo = {}  
  46.                 weibo['id'] = item.get('id')  
  47.                 weibo['text'] = pq(item.get('text')).text()  
  48.                 weibo['attitudes'] = item.get('attitudes_count')  
  49.                 weibo['comments'] = item.get('comments_count')  
  50.                 weibo['reposts'] = item.get('reposts_count')  
  51.                 yield weibo  
  52.     
  53.     
  54. from pymongo import MongoClient  
  55.     
  56. 建立MongoDB数据库链接  
  57. client = MongoClient()  
  58. db = client['weibo']  
  59. collection = db['weibo']  
  60.     
  61. def save_to_mongo(result):  
  62.     if collection.insert(result):  
  63.         print('Save to Mongo')  
  64.     
  65.     
  66. if __name__ == '__main__':  
  67.     for page in range(1, 11):  
  68.         json = get_page(page)  
  69.         results = parse_page(json)  
  70.         for result in results:  
  71.             print(result)  
  72.             save_to_mongo(result)  

 

效果:

爬取个人微博