1. 程式人生 > >python爬蟲——基於selenium用火狐模擬登陸爬搜尋關鍵詞的微博

python爬蟲——基於selenium用火狐模擬登陸爬搜尋關鍵詞的微博

preface:最近的任務,還是爬微博。之前的用不上,post提交,還是不太熟悉,模擬登陸不了,故換種方式,用selenium模擬登陸,從此任何登入以及js呼叫都是浮雲,我模擬登入分分鐘解決。之前的時而有用,時而沒用,不穩定,寫得不夠魯棒。但這次,真能夠抓取微博,表示還是有點進步的。

主要任務是通過搜尋關鍵詞,爬取跟關鍵詞有關的微博。

主要流程:

  1. 用selenium模擬滑鼠鍵盤登入;
  2. 模擬點搜尋框,輸入搜尋關鍵詞;
  3. 儲存當頁html,模擬點選下一頁;
  4. 直到沒有下一頁,處理儲存下來的html(也可在上一步直接提取,不儲存到當地),提取微博<p></p>之間的內容(若有展開全文形式的微博沒有處理);

效果:




具體效果跟真實點選效果一致,不過若是爬取太多次,會導致驗證問題,此時,可能需要換個賬號登入重新爬了。所以說,注意延時,time.sleep(),保證網速載入比較快比較重要。

coding:

# -*- coding: utf-8 -*-
import os

import 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:
        break
    if 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 = 1
    logging.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 += 1
            time.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 line
        text.append(line)
    return text
    
def 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:#若是重了,不加入到裡面
                pass
            else:
                texts_all.append(text)
    return texts_all

def 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火狐模擬登陸搜尋關鍵詞

preface:最近的任務,還是爬微博。之前的用不上,post提交,還是不太熟悉,模擬登陸不了,故換種方式,用selenium模擬登陸,從此任何登入以及js呼叫都是浮雲,我模擬登入分分鐘解決。之前的時而有用,時而沒用,不穩定,寫得不夠魯棒。但這次,真能夠抓取微博,表示還是有

python 爬蟲 如何通過scrapy簡單模擬登陸豆瓣網,手動進行圖形驗證碼的驗證

1.建立scrapy爬蟲程式,在terminal命令列輸入’scrapy startproject douban_login’ 2.建立爬蟲主程式,主要步驟都在這裡實現,以douban_login.py命名 程式程式碼如下: import scrapy from

[Python爬蟲]使用Selenium操作瀏覽器訂購火車票

cse input 相關 動態網頁 直接 教程 put vba 基礎 這個專題主要說的是Python在爬蟲方面的應用,包括爬取和處理部分 [Python爬蟲]使用Python爬取動態網頁-騰訊動漫(Selenium) [Python爬蟲]使用Python爬取靜態網頁-鬥魚直

python全棧系列之---cookie模擬登陸模擬session原理

ger -c AD log print imp 數據庫 sta 這一 cookie模擬登陸: import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self):

關於python爬蟲經常要到的一些Re.正則表達式

tput num -c output lock love spa dfa 全部 轉載:https://blog.csdn.net/skyeyesxy/article/details/50837984 1.正則表達式的常用符號與方法 常用符號:點號,星號,問號與括號(小括號)

Python爬蟲初探 - selenium+beautifulsoup4+chromedriver取需要登錄的網頁信息

-- pro tag bug gui 結果 .com 工作 ges 目標 之前的自動答復機器人需要從一個內部網頁上獲取的消息用於回復一些問題,但是沒有對應的查詢api,於是想到了用腳本模擬瀏覽器訪問網站爬取內容返回給用戶。詳細介紹了第一次探索python爬蟲的坑。 準備工作

Python爬蟲selenium的使用(八)

Python爬蟲之selenium的使用 一、簡介 二、安裝 三、使用     一、簡介     Selenium 是自動化測試工具。它支援各種瀏覽器,包括 Chrome,Safari,Firefox 等主流介面式瀏覽器,如果你在這些瀏

python爬蟲Selenium切換視窗控制代碼及呼叫Chrome瀏覽器

  一. 呼叫Chrome瀏覽器 首先,假設通過Firefox()瀏覽器定向爬取CSDN首頁導航欄資訊,審查元素程式碼如下圖所示,在div class="menu"路徑的ul、li、a下,同時可以定位ul class="clearfix"。  

學習筆記-Python爬蟲7-Selenium + PhantomJS

index ocs java org pytho doc http sel sta # 動態HTML - JavaScript - jQuery - Ajax - DHTML - Python采集動態數據 - 從JavaScrip

Python爬蟲Selenium

目錄 安裝 安裝selenium pip install selenium 安裝webdriver 去 https://blog.csdn.net/huilan_same/article/details/51896672 檢視w

Python 爬蟲利器 Selenium

前面幾節,我們學習了用 requests 構造頁面請求來爬取靜態網頁中的資訊以及通過 requests 構造 Ajax 請求直接獲取返回的 JSON 資訊。 還記得前幾節,我們在構造請求時會給請求加上瀏覽器 headers,目的就是為了讓我們的請求模擬瀏覽器的行為,防止被網站的反爬蟲策略限制。今天要介紹的 S

Python爬蟲selenium開啟新視窗和多視窗切換

上說可以通過傳送按鍵事件觸發,比如ctrl+T,不過我沒成功,使用了js開啟新視窗的方式程式碼示例 # -*- coding: utf-8 -*- # @File    : switch_tab.py # @Date    : 2018-07-27

Python爬蟲利器—selenium

在學習爬蟲的時候,我接觸了selenium,發現其強大功能,可以模擬真實情況操縱瀏覽器,其實也是相當於一個第三方的包。 selenium十分好用 特別在面對一些有針對反爬蟲設計的網站時,能達到用時間換資料的效果 安裝 在控制檯下用PIP操作可以下載,不過在使用的時候要多下載

Python爬蟲有什麼,網友紛紛給出自己的答案,以前是小看了爬蟲

  前言 爬蟲可以從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址,然後通過這些連結地址尋找下一個網頁,這樣一直迴圈下去,直到把這個網站所有的網頁都抓取完為止。 難道爬蟲真的只是這樣麼? 小編特地詢問很多網友Python有什麼用,大家給出

Python爬蟲selenium庫使用詳解

Python爬蟲之selenium庫使用詳解   什麼是Selenium selenium 是一套完整的web應用程式測試系統,包含了測試的錄製(selenium IDE),編寫及執行(Selenium Remote Control)和測試的並行處理(Selenium Grid)。Seleni

Python爬蟲有什麼,網友紛紛給出自己的答案,爬蟲能做的還是很多的

爬蟲可以從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址,然後通過這些連結地址尋找下一個網頁,這樣一直迴圈下去,直到把這個網站所有的網頁都抓取完為止。 難道爬蟲真的只是這樣麼? 小編特地詢問很多網友Python有什麼用,大家給出答案也是五花八門。 @冰藍

Python爬蟲Selenium常用操作,下載youtube視訊例項

selenium常用操作: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait

Python爬蟲selenium掛shadowsocks代理取網頁內容

selenium掛ss代理爬取網頁內容 from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import

Python爬蟲Selenium+ BeautifulSoup 取JS渲染的動態內容(雪球網新聞)

爬取目標:下圖中紅色方框部分的文章內容。(需要點選每篇文章的連結才能獲得文章內容) 注:該文章僅介紹爬蟲爬取新聞這一部分,爬蟲語言為Python。  乍一看,爬蟲的實現思路很簡單: (2)通過第一步所獲得的各篇文章的URL,抓取文章內容。 但是發現簡單使用urlli

【 專欄 】- Python爬蟲Selenium+Phantomjs+CasperJS

作者:楊秀璋 學歷:本科-北京理工大學            碩士-北京理工大學 現任教於貴財財經大學資訊學院 http://www.eastmountyxz.com 簡介:自幼受貴州大山的薰陶,養成了誠實質樸的性格。經過寒窗苦讀,考入BIT,為完成自己的教師夢,放棄IT、航天等工