1. 程式人生 > >豆瓣-代理ip登陸-css解決class空格

豆瓣-代理ip登陸-css解決class空格

from 代理ip like ice 可能 沒有權限 x11 http 列表

首先附上源碼:

from bs4 import BeautifulSoup
from selenium import webdriver
import time
from ArticleSpider.proxy_pool import proxy
import csv


#代理Ip
iplist=proxy().get_ip_list()
proxies=proxy().get_random_ip(iplist)

#賬號密碼
user={
    ‘word‘:‘賬號‘,
    ‘password‘:‘密碼‘
}

# 進入瀏覽器設置,選擇
options = webdriver.ChromeOptions()
#添加代理ip,獲得字典中的值
options.add_argument(str(proxies[‘https‘]))
#更換請求頭
brow = webdriver.Chrome(‘D:\Python\chromedriver.exe‘, chrome_options=options)

#輸入用戶信息,登錄!
url = ‘https://movie.douban.com/subject/26752088/comments?sort=new_score&status=P‘
brow.get(url)
brow.find_element_by_class_name(‘nav-login‘).click()
time.sleep(1)
brow.get(brow.current_url)
brow.find_element_by_class_name(‘account-tab-account‘).click()
brow.find_element_by_class_name(‘account-form-input‘).send_keys(user[‘word‘])
brow.find_element_by_id(‘password‘).send_keys(user[‘password‘])
#這裏使用css,因為多個class值,然後空格那裏改為.,並且前面也加.
brow.find_element_by_css_selector(‘.btn.btn-account.btn-active‘).click()
brow.maximize_window()#窗口最大化
time.sleep(2)


brow.get(url)
#打開文件,準備追加內容
file=open(‘yaoshen.csv‘,‘a‘,encoding=‘utf-8‘,newline=‘‘)
writer=csv.writer(file)

for j in range(30):
    #獲得當前url
    brow.get(brow.current_url)
    #切換窗口失敗!
    # brow.switch_to.window(str(brow.current_window_handle))
    soup=BeautifulSoup(brow.page_source,‘lxml‘)
    # print(soup)
    #滑動到底部
    time.sleep(1)
    brow.execute_script(‘window.scrollTo(0,2500)‘)
    time.sleep(1)
    for i in soup.find_all(‘span‘,class_="short"):
        content = i.get_text()
        content = content.strip()  # 去掉空格
        content = content.replace(‘\n‘, ‘‘).replace(‘\t‘, ‘‘).replace(‘\xa0‘, ‘‘).replace(‘\r‘, ‘‘)  # 去掉轉義字符
        content = content.split(‘*‘)  # 轉換為列表
        print(content)
        writer.writerow(content)

    time.sleep(2)
    #點擊下一頁
    brow.find_element_by_class_name(‘next‘).click()
# 退出,清除瀏覽器緩存
brow.quit()

  這個項目中用到了自己編寫的代理ip池代碼,將會在下面附上。

首先說一下遇到的錯誤,在選擇登錄豆瓣的時候,多次密碼錯誤,因為誤把其他網站密碼寫上去了,然後剛開始還找不到這個路徑,因為所屬的class有多個空格,需要使用css或者其他方法。

第一種方法:class值取其中之一,但是我覺得可能出錯,因為class值可能不唯一

第二種方法:使用 css.selector,每個class值前面加 .

此外,在debug過程中發現一直打印第一頁的評論,後來發現我只打開了一次瀏覽器,然後沒有更新url,所以解析得到的始終是第一頁的數據,所以需要使用brow.current_url來獲取點擊下一頁後的url,然後重新解析頁面

還有,每當我的瀏覽器運行到第十二頁左右就會提示我沒有權限,需要登陸,於是我就增加了一個登錄過程,雖然登陸後的頁面不是目標頁面,但是可以直接訪問目標頁面並且狀態依舊是已登錄狀態!

最後再附上代理ip池的代碼,這個項目中僅從代理ip池中取得一個代理ip,作用不大,但是可以看看,因為在selenium中使用代理ip的方法和requests的完全不一樣,不可以直接加到get方法中!

# IP地址取自國內髙匿代理IP網站:http://www.xicidaili.com/nn/

from bs4 import BeautifulSoup
import requests
import random
import urllib

class proxy(object):

    # 從代理ip網站獲取代理ip列表函數,並檢測可用性,返回ip列表
    def get_ip_list(self):
        url = ‘http://www.xicidaili.com/nn/‘
        headers = {
            ‘User-Agent‘: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36‘
        }
        rsp = requests.get(url, headers=headers)
        soup = BeautifulSoup(rsp.text, ‘lxml‘)
        #之前不使用lxml而使用html報錯,顯示最好使用lxml
        ips = soup.find_all(‘tr‘)
        # print(ips)
        ip_list = []
        #這個類只選擇第一頁的公開ip,暫時夠用了
        for i in range(1, len(ips)):
            ip_info = ips[i]
            tds = ip_info.find_all(‘td‘)
            ip_list.append(tds[1].text + ‘:‘ + tds[2].text)
        # 檢測ip可用性,移除不可用ip:(這裏其實總會出問題,移除的ip可能只是暫時不能用,剩下的ip使用一次後可能之後也未必能用)
        for ip in ip_list:
            try:
                proxy_host = "https://" + ip
                proxy_temp = {"https": proxy_host}
                #嘗試使用這個ip去打開百度的網站,如果能打開就默認為是可以使用的ip
                url_baidu=‘https://www.baidu.com‘
                urllib.urlopen(url_baidu, proxies=proxy_temp)
            except Exception as e:
                #如果無法打開百度網站,那麽就把這個ip從可用ip列表中移除
                ip_list.remove(ip)
                continue
        return ip_list

    # 從ip池中隨機獲取可用的ip列表
    def get_random_ip(self,ip_list):
        proxy_list = []
        for ip in ip_list:
            proxy_list.append(‘https://‘ + ip)
        #從可用ip列表中隨機選取一個可用ip
        proxy_ip = random.choice(proxy_list)
        proxies = {‘https‘: proxy_ip}
        return proxies

  

豆瓣-代理ip登陸-css解決class空格