python 版本 : 3.7
简介 :
把 main_spider 中 user_id 和 cookie 改为自己的 id 和 cookie.
打开微博手机版 https://m.weibo.cn/
进入指定用户主页, 如李荣浩的主页 :
其中 1739046981 就是用户 id.
登录微博, 进入个人主页, 右键审查元素, 切换到 Network 栏, 勾选 perserve log.
在左边 name 栏找到 m.weibo.cn(或者其他能找到 cookie) 的 url, 从右边 response header 中找到 COOKIE 并复制粘贴到代码中.
image.PNG
main_spider.py 代码
- # _*_ coding: utf-8 _*_
- import sys
- import os
- from bs4 import BeautifulSoup # BeautifulSoup 为 python 爬虫库
- import requests # 网络请求库
- import time
- from lxml import etree # python 解析库, 支持 html,xml,XPath 解析
- from urllib.request import urlretrieve # 用于图片下载
- # 改成自己的 user_id 和 cookie
- user_id = YOUR_ID
- cookie = {"Cookie": "YOUR_COOKIE"}
- # 初始 url
- url = 'http://weibo.cn/%d/profile?page=1'%user_id
- # 获取初始 url 页面 HTML 内容, 获取 user_id 和 cookie(在返回的 response header 中)
- HTML = requests.get(url, cookies = cookie).content
- print ('user_id 和 cookie 读入成功')
- # HTML 元素 selector
- selector = etree.HTML(HTML)
- # 通过 xpath 获取该用户微博页面总数
- pageNum = int(selector.xpath('//input[@name="mp"]')[0].attrib['value'])
- result = ""
- word_count = 1 # 爬取的微博和图片数
- image_count = 1
- imgsrc_list = [] # 图片链接列表
- print ('该用户微博页数 :',pageNum)
- times = 5
- one_step = int(pageNum/times)
- for step in range(times):
- if step < times - 1:
- i = int(step * one_step + 1)
- j = int((step + 1) * one_step + 1)
- else:
- i = int(step * one_step + 1)
- j = int(pageNum + 1)
- for page in range(i, j):
- try:
- # 目标页面 url
- url = 'http://weibo.cn/%d/profile?page=%d'%(user_id,page)
- print('正在爬取 url :',url)
- # 获取当前 url 页面微博内容
- lxml = requests.get(url, cookies = cookie).content
- selector = etree.HTML(lxml)
- # 获取该页面微博 list
- content = selector.xpath('//span[@class="ctt"]')
- # 遍历每条微博
- for each in content:
- # 获取文本内容, 加入 result, 记录条数
- text = each.xpath('string(.)')
- text = "%d:"%(word_count) +text+"\n"
- result = result + text
- word_count += 1
- print ('第 %d 页微博内容爬取完完成'%(page))
- # 把当前页面 lxml 实例化为 soup 对象
- soup = BeautifulSoup(lxml, "lxml")
- # 获取所有图片链接
- urllist = soup.find_all(class_='ib')
- # 遍历每个图片 url, 加入
- for imgurl in urllist:
- imgsrc = imgurl.get('src')
- imgsrc_list.append(imgsrc)
- image_count += 1
- print ('第 %d 页图片爬取完成, 获得如下图片:\n%s'%(page,imgsrc_list))
- except:
- print ('第',page,'页发生错误')
- time.sleep(0.001) # 爬取每页间隔时间
- print ('正在进行第', step + 1, '次停顿, 防止访问次数过多')
- time.sleep(1)
- try:
- # 打开文本存放文件, 如果不存在则新建
- fo_txt = open(os.getcwd()+"/%d"%user_id+".txt", "w")
- result_path = os.getcwd() + '/%d' % user_id+".txt"
- print('微博内容文本存放路径为 :',result_path)
- fo_txt.write(result) # 将结果写入文件
- print('爬取成功!\n 该用户微博内容:\n\n%s\n 文本存放路径为 %s' % (result,result_path))
- except:
- print ('微博文本内容保存失败')
- if not imgsrc_list:
- print ('该用户原创微博中不存在图片')
- else:
- # 图片存放文件夹路径
- picdir=os.getcwd()+'/weibo_image'+str(user_id)
- print(picdir)
- if os.path.exists(picdir) is False:
- os.mkdir(picdir) # 若不存在则新建
- img_index = 1
- # 遍历图片
- for imgurl in imgsrc_list:
- # 图片本地存放路径
- img_path = picdir + '/%s.jpg' % img_index
- print('正在保存',img_path)
- # 将图片下载到本地
- urlretrieve(imgurl, img_path)
- img_index += 1
- print('该用户微博图片下载完成! 共有 %d 张图片, 存放文件夹为 %s'%(img_index,picdir))
运行截图 :
image.PNG
image.PNG
image.PNG
爬取的微博内容文件会被放到工程目录下用户对应的 txt 文件 (自动生成).
图片放到对应 weibo_image 文件下.
image.PNG
image.PNG
来源: http://www.jianshu.com/p/f65829b22b91