[python 爬虫] BeautifulSoup 爬取指定用户原创微博及图片 (代码 + 注释)
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 _*_
importsys
importos
frombs4importBeautifulSoup# BeautifulSoup 为 python 爬虫库
importrequests# 网络请求库
importtime
fromlxmlimportetree# python 解析库, 支持 html,xml,XPath 解析
fromurllib.requestimporturlretrieve# 用于图片下载
# 改成自己的 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)
forstepinrange(times):
ifstep
i=int(step*one_step+1)
j=int((step+1)*one_step+1)
else:
i=int(step*one_step+1)
j=int(pageNum+1)
forpageinrange(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"]')
# 遍历每条微博
foreachincontent:
# 获取文本内容, 加入 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, 加入
forimgurlinurllist:
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('微博文本内容保存失败')
ifnotimgsrc_list:
print('该用户原创微博中不存在图片')
else:
# 图片存放文件夹路径
picdir=os.getcwd()+'/weibo_image'+str(user_id)
print(picdir)
ifos.path.exists(picdir)isFalse:
os.mkdir(picdir)# 若不存在则新建
img_index=1
# 遍历图片
forimgurlinimgsrc_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