python爬虫(三):selenium+requests获取P站动态加载内容

selenium

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。(来自百度百科)

我们只需要知道它能用来控制浏览器,然后执行我们想要执行的操作。

那么我们应该怎么使用selenium呢?

我这里使用的是selenium+chrome,要是有人用Firefox,就麻烦你自行百度一下selenium+Firefox的操作,不过两者的原理是没有区别的,只是语句有一些不同。然后我的代理依然是s。

  • 首先我们要下载chromedriver(下载链接:http://chromedriver.chromium.org/downloads)
  • 然后我们就可以开始写代码了。
    我先把代码贴出来。

    我的python环境是2.7,python3.6的环境我没测试过,也许会报错
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.proxy import *
    import time
    import os
    import requests
    
    PROXY = "127.0.0.1:1080"#这个是浏览器用的代理
    proxy_requests={
        'https':'socks5://127.0.0.1:1080'
    }#这个是requests用的代理
    
    headers={
        'Referer':'https://www.pixiv.net/member_illust.php?mode=medium&illust_id=70639869'
    }#这个Referer必须要有,我在上一篇博客已经说过了
    
    #添加浏览器的代理
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--proxy-server=socks5://%s' % PROXY)
    
    chrome = webdriver.Chrome("/home/user/Downloads/chromedriver_linux64/chromedriver",chrome_options=chrome_options)#/home/user/Downloads/chromedriver_linux64/chromedriver这个是我电脑上chromedriver的地址,换成你的就好了
    chrome.get("https://www.pixiv.net")#打开P站
    time.sleep(1)
    chrome.find_element_by_xpath('//*[@id="wrapper"]/div[3]/div[2]/a[2]').click()
    time.sleep(1)
    chrome.find_element_by_xpath('//*[@id="LoginComponent"]/form/div[1]/div[1]/input').send_keys("你的账号")
    time.sleep(1)
    chrome.find_element_by_xpath('//*[@id="LoginComponent"]/form/div[1]/div[2]/input').send_keys("你的密码")
    time.sleep(1)
    chrome.find_element_by_xpath('//*[@id="LoginComponent"]/form/button').click()
    time.sleep(1)
    chrome.find_element_by_xpath('//*[@id="column-misc"]/section[2]/h1/a').click()#打开每日排行榜
    time.sleep(1)
    chrome.find_element_by_xpath('//*[@id="5"]/div[2]/a').click()#这是我这要抓取的页面
    time.sleep(1)
    
    while(True):
        try:
            windows = chrome.window_handles#获取窗口权柄
            chrome.switch_to.window(windows[-1])#返回最新打开的窗口
            chrome.execute_script("window.scrollTo(0, document.body.scrollHeight);")#下拉到窗口页面最下端,这时浏览器就会自动把所有的动态加载项加载了,不用我们操作了
            time.sleep(1)
            #获取图片链接
            url = {}
            for i in range(1, 181):
                url[i - 1] = chrome.find_element_by_xpath(
            '//*[@id="root"]/div[1]/div/aside[3]/div[1]/ul/li[' + str(i) + ']/div/a[1]/div').get_attribute('style')#获取style属性,图片的url就存放这里面
                print(url[i - 1])
            #构造一下高清大图的地址
            url_front = 'https://i.pximg.net'
            url_behind = 'master1200.jpg'
            for i in range(len(url)):
                url[i] = url_front + url[i][55:103] + url_behind
                print(url[i])
    
            path = '/home/user/loginpixiv_selenium/pic'#/home/user/loginpixiv_selenium改为你当前目录的绝对地址
            if not os.path.exists(path):
                os.makedirs(path)
            #使用requests获取图片
            for i in range(len(url)):
                if url[i] != 'https://i.pximg.netmaster1200.jpg':
                img = requests.get(url[i], proxies=proxy_requests, headers=headers)
                print('----------------------downloading img' + url[i] + '------------------------------')
                fp = open('pic/' + str(i) + '.jpg', 'wb')
                fp.write(img.content)
                fp.close()
                print('----------------------succeed!----------------------------------------')
            break
        except:
            print("error")
            continue
    
    chrome.quit()#关闭浏览器
    

    在python中使用selenium,要下载selenium模板(pip install selenium)
    然后这几行代码有一点问题。

    windows = chrome.window_handles#获取窗口权柄
    chrome.switch_to.window(windows[-1])#返回最新打开的窗口
    chrome.execute_script("window.scrollTo(0, document.body.scrollHeight);")#下拉到窗口页面最下端
    

    有时候这几行代码不会下拉当前页面,而是下拉了其他页面,这是由于selenium本身的问题,可以让它多循环几次来确保当前页面已经拉到了最下端。
    最后是我抓取的结果

    然后我发现我的第一篇博客中登录微博的代码已经不行了,因为微博刚加了验证码,所以我们之前的代码无法登陆了,下一篇博客我就来说说怎么来解决验证码的问题。

你可能感兴趣的:(python,crawler)