python爬虫(四)抓取实战-历史微博归档

项目介绍

最近整理了一些爬虫资料,现在将其整合做一个实战案例,顺便为女神的微博吸粉 :)

逻辑梳理

  1. 条件:女神微博地址 https://weibo.com/u/3035774121
  2. 需求:获取微博历史,将其保存为历史记录文件
    本例重点抓取微博记录的发送时间、内容文本以及转发微博的原内容文本
  3. 思路(实现方案):
    1. 首先通过浏览器做页面访问,抓取到微博历史请求
      控制台抓取到的请求地址为 https://weibo.com/p/aj/v6/mblog/mbloglist
    2. 通过对请求的分析,找到变量x,控制其改变可以连续获取分页数据
      经分析,有三个参数需要变动:
      a. page/pre_page 当前请求的页数(range(0,max+1))
      b. pagebar 请求当前页的第几部分(range(0,2))
      c. __rnd 请求发起的时间戳(math.ceil(time.time() * 1000))
    3. 通过对响应的分析,整理解析方案
      此请求返回值为json串,需先解析json获取其中的页面代码,然后正常解析网页
    4. 整理2/3步骤的操作,编码完成请求及解析操作
    5. 将结果保存至csv文件中,归档保存

代码实现

import requests
from lxml import etree

import math
import time
import json

append_temp = '''
https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&refer_flag=1005050005_&is_all=1&pagebar={1}&pl_name=Pl_Official_MyProfileFeed__21&id=1005053035774121&script_uri=/u/3035774121&feed_type=0&page={0}&pre_page={0}&domain_op=100505&__rnd={2}"
'''

headers = {
    'Host': 'weibo.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
    'Cookie': '',  # 时效内容,需自行抓取
    'Referer': 'https://weibo.com/u/3035774121?refer_flag=1005050005_&is_all=1'
}

wb_list = []
# 此处可以根据页面返回动态获取页数,这里从简
for page in range(0, 24):
    for page_bar in range(0, 2):
        now_time = math.ceil(time.time() * 1000)
        url = append_temp.format(page, page_bar, str(now_time))
        print(url)
        req = requests.get(url, headers=headers).text
        html = etree.HTML(json.loads(req)['data'])
        div_list = html.xpath('/html/body/div')
        for div in div_list:
            wb_from = div.xpath('string(div/div[@class="WB_detail"]/div[@class="WB_from S_txt2"]/a/@title)')
            wb_text = div.xpath('string(div/div[@class="WB_detail"]/div[@class="WB_text W_f14"])')
            wb_quot = div.xpath(
                'string(div/div[@class="WB_detail"]/div[@class="WB_feed_expand"]/div/div[@class="WB_text"])')
            wb_dict = {
                'from': wb_from,
                'text': wb_text,
                'quot': wb_quot
            }
            wb_list.append(wb_dict)
        time.sleep(1)

import pandas

df = pandas.DataFrame(wb_list, columns=['from', 'text', 'quot'])
df.to_csv('wb_his.csv')

猜你喜欢

转载自blog.csdn.net/bkk854762363/article/details/78926481
今日推荐