Python selenium爬取微博数据代码实例


Posted in Python onMay 22, 2020

爬取某人的微博数据,把某人所有时间段的微博数据都爬下来。

具体思路:

创建driver-----get网页----找到并提取信息-----保存csv----翻页----get网页(开始循环)----...----没有“下一页”就结束,

用了while True,没用自我调用函数

嘟大海的微博:https://weibo.com/u/1623915527

办公室小野的微博:https://weibo.com/bgsxy

代码如下

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv
import os
import time
 
#只有这2个参数设置,想爬谁的微博数据就在这里改地址和目标csv名称就行
weibo_url = 'https://weibo.com/bgsxy?profile_ftype=1&is_all=1#_0'
csv_name = 'bgsxy_allweibo.csv'
 
def start_chrome():
  print('开始创建浏览器')
  driver = webdriver.Chrome(executable_path='C:/Users/lori/Desktop/python52project/chromedriver_win32/chromedriver.exe')
  driver.start_client()
  return driver
 
def get_web(url):   #获取网页,并下拉到最底部
  print('开始打开指定网页')
  driver.get(url)
  time.sleep(7)
  scoll_down()
  time.sleep(5)
 
def scoll_down():  # 滚轮下拉到最底部
  html_page = driver.find_element_by_tag_name('html')
  for i in range(7):
    print(i)
    html_page.send_keys(Keys.END)
    time.sleep(1)
 
def get_data():
  print('开始查找并提取数据')
  card_sel = 'div.WB_cardwrap.WB_feed_type'
  time_sel = 'a.S_txt2[node-type="feed_list_item_date"]'
  source_sel = 'a.S_txt2[suda-uatrack="key=profile_feed&value=pubfrom_guest"]'
  content_sel = 'div.WB_text.W_f14'
  interact_sel = 'span.line.S_line1>span>em:nth-child(2)'
 
  cards = driver.find_elements_by_css_selector(card_sel)
  info_list = []
 
  for card in cards:
    time = card.find_elements_by_css_selector(time_sel)[0].text #虽然有可能在一个card中有2个time元素,我们取第一个就对
    if card.find_elements_by_css_selector(source_sel):
      source = card.find_elements_by_css_selector(source_sel)[0].text
    else:
      source = ''
    content = card.find_elements_by_css_selector(content_sel)[0].text
    link = card.find_elements_by_css_selector(time_sel)[0].get_attribute('href')
    trans = card.find_elements_by_css_selector(interact_sel)[1].text
    comment = card.find_elements_by_css_selector(interact_sel)[2].text
    like = card.find_elements_by_css_selector(interact_sel)[3].text
    info_list.append([time,source,content,link,trans,comment,like])
 
  return info_list
 
def save_csv(info_list,csv_name):
  csv_path = './' + csv_name
  print('开始写入csv文件')
  if os.path.exists(csv_path):
    with open(csv_path,'a',newline='',encoding='utf-8-sig') as f: #newline=''避免空行;encoding='utf-8-sig'比utf8牛,保存中文没问题
      writer = csv.writer(f)
      writer.writerows(info_list)
  else:
    with open(csv_path,'w+',newline='',encoding='utf-8-sig') as f:
      writer = csv.writer(f)
      writer.writerow(['发布时间','来源','内容','链接','转发数','评论数','点赞数'])
      writer.writerows(info_list)
  time.sleep(5)
 
def next_page_url():
  next_page_sel = 'a.page.next'
  next_page_ele = driver.find_elements_by_css_selector(next_page_sel)
  if next_page_ele:
    return next_page_ele[0].get_attribute('href')
  else:
    return None
 
 
driver = start_chrome()
input('请在chrome中登录weibo.com')   # 暂停程序,手动登录weibo.com
 
while True:
  get_web(weibo_url)
  info_list = get_data()
  save_csv(info_list,csv_name)
  if next_page_url():
    weibo_url = next_page_url()
  else:
    print('爬取结束')
    break

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
python的keyword模块用法实例分析
Jun 30 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
python3 求约数的实例
Dec 05 Python
Python3 Click模块的使用方法详解
Feb 12 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 Python
Python之多进程与多线程的使用
Feb 23 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
python实现文法左递归的消除方法
May 22 #Python
使用Django搭建网站实现商品分页功能
May 22 #Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 #Python
Python实现发票自动校核微信机器人的方法
May 22 #Python
基于django micro搭建网站实现加水印功能
May 22 #Python
基于Tensorflow一维卷积用法详解
May 22 #Python
Python参数传递机制传值和传引用原理详解
May 22 #Python
You might like
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
Python程序语言快速上手教程
2012/07/18 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
python 读取修改pcap包的例子
2019/07/23 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
探亲邀请信范文
2014/01/30 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
应届毕业生自荐信
2014/05/28 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL