preface:最近的任务,还是爬微博。之前的用不上,post提交,还是不太熟悉,模拟登陆不了,故换种方式,用selenium模拟登陆,从此任何登录以及js调用都是浮云,我模拟登录分分钟解决。之前的时而有用,时而没用,不稳定,写得不够鲁棒。但这次,真能够抓取微博,表示还是有点进步的。

主要任务是通过搜索关键词,爬取跟关键词有关的微博。

主要流程:

  1. 用selenium模拟鼠标键盘登录;
  2. 模拟点搜索框,输入搜索关键词;
  3. 保存当页html,模拟点击下一页;
  4. 直到没有下一页,处理保存下来的html(也可在上一步直接提取,不保存到当地),提取微博<p></p>之间的内容(若有展开全文形式的微博没有处理);

效果:

具体效果跟真实点击效果一致,不过若是爬取太多次,会导致验证问题,此时,可能需要换个账号登录重新爬了。所以说,注意延时,time.sleep(),保证网速加载比较快比较重要。

coding:

# -*- coding: utf-8 -*-
import osimport time
import logging
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from bs4 import BeautifulSoup as bs
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
'''
0.安装火狐
1.安装selenium,可通过pip安装:pip install selenium
2.程序里面改三处:用户名、密码、搜过的关键词search_text
3.需要手动输入验证码,并且验证码大小写敏感,若是输错了,等3秒再输入。
4.爬下来了,用BeautifulSoup提取,并且将相同文本的放在一起,并且排序时间:5秒一个,不可缩短,不然加载不出来下一页这个按钮,然后程序就挂了,若网速快些,延时可以短些。
'''
#username_  = "你自己的微博号"
#password_  = "密码"
#logging.basicConfig(level=logging.DEBUG)
logging.basicConfig(level=logging.INFO)browser = webdriver.Firefox()
href = 'http://s.weibo.com/'
browser.get(href)
time.sleep(2)# 右上登陆
login_btn = browser.find_element_by_xpath('//a[@node-type="loginBtn"]')
login_btn.click()
time.sleep(3)# 选择账号登录
name_login = browser.find_element_by_xpath('//a[@action-data="tabname=login"]')
name_login.click()
time.sleep(2)# 输入用户名,密码
username = browser.find_element_by_xpath('//input[@node-type="username"]')
password = browser.find_element_by_xpath('//input[@node-type="password"]')
username.clear()
username.send_keys(username_)
password.clear()
password.send_keys(password_)# 提交登陆
sub_btn = browser.find_element_by_xpath('//a[@suda-data="key=tblog_weibologin3&value=click_sign"]')
sub_btn.click()while True:try:verify_img = browser.find_element_by_xpath('//img[@node-type="verifycode_image"]')except NoSuchElementException:breakif verify_img:# 输入验证码verify_code = browser.find_element_by_xpath('//input[@node-type="verifycode"]')verify_code_ = raw_input('verify_code > ')verify_code.clear()verify_code.send_keys(verify_code_)# 提交登陆sub_btn = browser.find_element_by_xpath('//a[@suda-data="key=tblog_weibologin3&value=click_sign"]')sub_btn.click()time.sleep(2)else:break
#===============================以上这部分的登陆,放在函数里面返回browser出错,需要单独拿出来========================
def get_weibo_search(search_text, browser):search_form.send_keys(search_text.decode('utf-8'))#将关键词送到搜索栏中,进行搜索# 点击搜索search_btn = browser.find_element_by_xpath('//a[@class="searchBtn"]')search_btn.click()time.sleep(3)#进入循环之前,让第一页先加载完全。# 这块可以得到具体的网页信息count = 1logging.info('try download html for : {}'.format(search_text.encode("gbk")))topics_name = search_text.encode("gbk")topics_name = topics_name.replace(" ","_")#将名字里面的空格换位_os_path = os.getcwd()key_dir = os.path.join(os_path,topics_name)if not os.path.isdir(key_dir):os.mkdir(key_dir)while True:# 保存网页    file_name = topics_name+os.sep+'{}_{}.html'.format(topics_name, count)with open(file_name, 'w') as f:f.write(browser.page_source)logging.info('for page {}'.format(count))try:next_page = browser.find_element_by_css_selector('a.next')#next_page = browser.find_element_by_xpath('//a[@class="page next S_txt1 S_line1"]')time.sleep(1)next_page.click()#有的时候需要手动按F5刷新,不然等太久依然还是出不来,程序就会挂,略脆弱。count += 1time.sleep(5)#完成一轮之前,保存之前,先让其加载完,再保存except Exception,e:#异常这里,跑一次,跳出,跑多个query,断了一个query后,下个继续不了,还需优化logging.error(e)break
#======================================================
def get_weibo_text(file_name):#将html文件里面的<p></p>标签的内容提取出来text = []soup = bs(open(file_name))items = soup.find_all("div",class_="WB_cardwrap S_bg2 clearfix")if not items:text = []for item in items:line = item.find("p").get_text()#print linetext.append(line)return textdef get_weibo_all_page(path, file_names):#将<span style="font-family: Arial, Helvetica, sans-serif;">文件夹下所有文件里提取出来微博的合并起来</span>
texts_all = []for file_name in file_names:#print file_name,texts = get_weibo_text(path+os.sep+file_name)#print len(texts)for text in texts:text = text.replace("\t","")text = text.strip("\n")text = text.strip(" ")if text in texts_all:#若是重了,不加入到里面passelse:texts_all.append(text)return texts_alldef get_results_weibo(weibos_name):#合并若干个文件夹下提取出来的微博texts = []for file_name in weibos_name:with open(file_name) as f:text = f.readlines()for line in text:line = line.strip("\n")if line not in texts:texts.append(line)return texts
#==================
if __name__=="__main__":try:#browser = login()# 进行搜索search_form = browser.find_element_by_xpath('//input[@class="searchInp_form"]')search_form.clear()searchs_text = ["火影忍者","火影忍者 雏田","火影忍者 小樱"]for search_text in searchs_text:get_weibo_search(search_text, browser)#======path = search_text.encode("gbk")path = path.replace(" ","_")#文件夹路径里面若有空格,替换为下滑线file_names = os.listdir(path)texts_all = get_weibo_all_page(path, file_names)texts_all_sorted = sorted(texts_all)weibo_text_name = path+"_weibos.txt"f = open(weibo_text_name,"w")for text in texts_all_sorted:f.write(text+"\n")f.close()except Exception,e:print e#============将几个_weibos.txt文件合并到一起print "together:"file_names_weibos = [i for i in os.listdir(os.getcwd()) if i.endswith("_weibos.txt")]texts = get_results_weibo(file_names_weibos)f = open("results.txt","w")for text in sorted(texts):f.write(text+"\n")f.close()

转载请注明来源:http://blog.csdn.net/u010454729?viewmode=list

python爬虫——基于selenium用火狐模拟登陆爬搜索关键词的微博相关推荐

  1. 爬虫系列(2):暴力爬虫——基于selenium和xpath定位方法爬取某个话题下的微博内容

    为什么这期要叫暴力爬虫呢?因为笔者认为基于selenium方法非常的简单粗暴!!理由有两点: 1.在selenium方法下,我们可以通过调用浏览器驱动来实现模拟鼠标点击.滑轮下滑以及输入文本等操作,就 ...

  2. 使用Python和selenium的Chromedriver模拟登陆爬取网站信息(beautifulsoup)

    爬取的信息很多,所以需要设置断点,在程序重启时能继续爬取.并且能在断掉之后自动重启. 1.setting.py 对爬取的常量进行设置 """ 基本信息设置 "& ...

  3. 基于selenium实现12306模拟登陆

    from selenium import webdriver from time import sleepdef detect_selenium(browser):# 如果window.navigat ...

  4. Python爬虫学习(简单的模拟登陆(一))

    可以成功的爬取我室友的微博首页 #-*-coding:utf8-*-import requests from lxml import etreecook = {"Cookie": ...

  5. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  6. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  7. python爬取新浪新闻首页_Python爬虫学习:微信、知乎、新浪等主流网站的模拟登陆爬取方法...

    微信.知乎.新浪等主流网站的模拟登陆爬取方法 摘要:微信.知乎.新浪等主流网站的模拟登陆爬取方法. 网络上有形形色色的网站,不同类型的网站爬虫策略不同,难易程度也不一样.从是否需要登陆这方面来说,一些 ...

  8. Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

    Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息 基础: Python 爬虫 之 Selenium.webdriver 的安装,以及模拟打开操作 ...

  9. 零基础:Python之Selenium操作浏览器模拟登陆QQ邮箱

    零基础:Python之Selenium操作浏览器模拟登陆QQ邮箱 一. Selenium简介 二. 环境配置 2.1 Python运行环境搭建 2.2 Selenium相关安装与配置 2.2.1 Se ...

最新文章

  1. Ajax实现局部数据交互的一个简单实例
  2. 通过分析 JDK 源代码研究 Hash 存储机制
  3. 如何装keras-gpu?
  4. 点号与冒号操作符的区别
  5. Notification的功能和用法 加薪通知
  6. 任正非:华为 5G 是瞎猫碰死老鼠
  7. android高德marker添加点击,高德地图上添加marker,给每一个marker添加点击事件。...
  8. Java学习笔记-对IoC(Inversion of Control)的基本认识
  9. 大数据之HBase部署
  10. jquery 里 $(this)的用法
  11. NameError: name 'random' is not defined
  12. Vue表单输入绑定(文本框和复选框)
  13. 哪个服务器支持高并发,IIS Web服务器支持高并发设置方法详解
  14. 从零开始,讲解详细,贴近实际应用,全面掌握用友ERP财务管理
  15. 2022苏州市小学信息学奥赛T2-汉诺塔
  16. android 上运行python脚本,Android上执行python脚本-QPython
  17. android 判断 飞行模式,Android 设置飞行模式,判断是否是飞行模式
  18. Android 百度翻译API(详细步骤+源码)
  19. 调试Linux OpenWrt 2.6.36+华为ME909s-821 4G模块
  20. C++:乱码之字符串编码

热门文章

  1. 微信小程序跟淘宝的对比,做生意的必看
  2. jQuery框架(一):介绍
  3. 程序员和瑜伽_每个程序员都应尝试的5种瑜伽姿势
  4. scale改变元素尺寸
  5. 周末韶关行之乳源大峡谷
  6. 2022 年全国职业院校技能大赛 网络搭建与应用赛项正式赛卷
  7. java007如何java创建一个类
  8. css实现超出部分显示省略号
  9. 如何用css和HTML设置聚光灯效果
  10. 获得预测值之后的步骤(导入arcgis)