zoukankan      html  css  js  c++  java
  • 豆瓣-代理ip登陆-css解决class空格

    首先附上源码:

    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:Pythonchromedriver.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('
    ', '').replace('	', '').replace('xa0', '').replace('
    ', '')  # 去掉转义字符
            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
    

      

  • 相关阅读:
    ArrayList集合封装 类 并通过方法调用
    ArrayList集合的基本操作
    方法的重复定义和重载
    方法间值的传递,二维数组的定义和遍历
    赋值运算,逻辑运算符,引用数据类型
    Javase;jdk的安装调试;基础语法和变量以及基础数据类型
    E-R画图规则和数据库设计的三大范式
    sql多表查询和子查询
    sql约束的使用
    sql表操作的基础语法
  • 原文地址:https://www.cnblogs.com/fodalaoyao/p/10509689.html
Copyright © 2011-2022 走看看