[selenium]selenium驱动chrome爬取网页/无界面chrome/使用代理

selenium与chromedriver安装

  • 安装chrome(有版本要求,linux和windows版本要求不同,可自行查阅,尽量使用61+版本的chrome)
  • 先安装selenium库,在下载chromedriver,将chromedriver放入环境变量方便selenium调用。

selenium调用chrome

代码可以直接运行,只需修改代理参数,该代码实现了: 1. 无代理爬取京东单个商品:selenium+headless chrome 2. 普通代理爬取京东单个商品:selenium+headless chrome+proxy 3. 需要验证的代理爬取京东单个商品:selenium+headless chrome+proxy(auth)(暂时无法使用headless方式)

#!/usr/bin/env python3
# coding=utf-8
import logging
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException, StaleElementReferenceException
from selenium.webdriver.chrome.options import Options
import time
import json
from json import decoder
import os
import re
import zipfile
# https://github.com/revotu/selenium-chrome-auth-proxy下载插件放入指定文件夹
CHROME_PROXY_HELPER_DIR = 'proxy_helper/'
CUSTOM_CHROME_PROXY_EXTENSIONS_DIR = 'proxy_helper/'
def get_chrome_proxy_extension():  # 若要使用需要验证的代理,使用该函数生成插件,自行填写账号密码
    username = 'xxxxxxxxxx'
    password = 'xxxxxxxxxx'
    ip = 'xxxxxxxxx'
    port = 'xxxx'
    # 创建一个定制Chrome代理扩展(zip文件)
    if not os.path.exists(CUSTOM_CHROME_PROXY_EXTENSIONS_DIR):
        os.mkdir(CUSTOM_CHROME_PROXY_EXTENSIONS_DIR)
    extension_file_path = os.path.join(CUSTOM_CHROME_PROXY_EXTENSIONS_DIR, '{}.zip'.format('H923L212M07Z5ILP_A067B921FBCBA86E@http-pro.abuyun.com_9010'))
    if not os.path.exists(extension_file_path):
        # 扩展文件不存在,创建
        zf = zipfile.ZipFile(extension_file_path, mode='w')
        zf.write(os.path.join(CHROME_PROXY_HELPER_DIR, 'manifest.json'), 'manifest.json')
        # 替换模板中的代理参数
        background_content = open(os.path.join(CHROME_PROXY_HELPER_DIR, 'background.js')).read()
        background_content = background_content.replace('%proxy_host', ip)
        background_content = background_content.replace('%proxy_port', port)
        background_content = background_content.replace('%username', username)
        background_content = background_content.replace('%password', password)
        zf.writestr('background.js', background_content)
        zf.close()
    return extension_file_path


class Crawler(object):

    def __init__(self, proxy=None):
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        prefs = {"profile.managed_default_content_settings.images": 2}  # not load image
        chrome_options.add_experimental_option("prefs", prefs)
        if proxy:
            proxy_address = proxy['https']
            chrome_options.add_argument('--proxy-server=%s' % proxy_address)  # 使用不需验证的代理
            # chrome_options.add_extension(get_chrome_proxy_extension())  # 使用需要验证的代理
            logging.info('Chrome using proxy: %s', proxy['https'])
        self.chrome = webdriver.Chrome(chrome_options=chrome_options)
        # wait 3 seconds for start session (may delete)
        self.chrome.implicitly_wait(5)
        # set timeout like requests.get()
        # jd sometimes load google pic takes much time
        self.chrome.set_page_load_timeout(60)
        # set timeout for script
        self.chrome.set_script_timeout(60)

    def get_jd_item(self, item_id):
        item_info = ()
        url = 'https://item.jd.com/' + item_id + '.html'
        try:
            self.chrome.get(url)
            name = self.chrome.find_element_by_xpath("//*[@class='sku-name']").text
            price = self.chrome.find_element_by_xpath("//*[@class='p-price']").text
            subtitle = self.chrome.find_element_by_xpath("//*[@id='p-ad']").text
            plus_price = self.chrome.find_element_by_xpath("//*[@class='p-price-plus']").text
            item_info = [name, price[1:], subtitle, plus_price[1:]]  # tuple cannot change plus_price
            logging.debug('item_info:{}, {}, {}, {}'.format(name, price, subtitle, plus_price))
            logging.info('Crawl SUCCESS: {}'.format(item_info))
        except NoSuchElementException as e:
            logging.warning('Crawl failure: {}'.format(e))
        except TimeoutException as e:
            logging.warning('Crawl failure: {}'.format(e))
        self.chrome.quit()
        return item_info




if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    while True:
        start = time.time()
        # c = Crawler()
        c = Crawler({'http': 'http-pro.abuyun.com:9010', 'https': 'http-pro.abuyun.com:9010'})
        logging.debug(c.get_jd_item('3133927'))
        end = time.time()
        print(end-start)

有问题请留言咨询!转载请注明!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逍遥剑客的游戏开发

C#脚本实践(四): 反射与序列化

15250
来自专栏JAVA技术zhai

为什么说解耦的战术,决定了架构的高度?

架构设计中,大家都不喜欢耦合,但有哪些典型的耦合是我们系统架构设计中经常出现的,又该如何优化?这里列举了6个点:IP、jar包、数据库、服务、消息、扩容。这些点...

17520
来自专栏小L的魔法馆

POJ 1113--Wall(计算凸包)

Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40363 ...

10530
来自专栏小L的魔法馆

POJ 1410--Intersection(判断线段和矩形相交)

Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions:...

20330
来自专栏小L的魔法馆

HDU 6354--Everything Has Changed(判断两圆关系+弧长计算)

11350
来自专栏Python程序员杂谈

从问题到探索--从slice说起

如果你是新手,你发现你对于别人说的一切都表示有疑问,那么恭喜你!你拥有大部分编程老手已经遗忘的能力——对细节的敏感。善于发现问题是一个很好的习惯,接触的东西多了...

8520
来自专栏Python程序员杂谈

由__future__中unicode_literals引起的错误来研究python中的编码问题

在py2.7的项目中用了future模块中的 unicode_literals 来为兼容py3.x做准备,今天遇到一个UnicodeEncodeError的错误...

12810
来自专栏小L的魔法馆

HDU 6330--Visual Cube(构造,计算)

9350
来自专栏小L的魔法馆

2018 Wannafly summer camp Day3--Knight

Knight 题目描述: 有一张无限大的棋盘,你要将马从(0,0)(0,0)(0,0)移到(n,m)(n,m)(n,m)。 每一步中,如果马在(x,...

8030
来自专栏小L的魔法馆

atan和atan2反正切计算

返回值 若不出现错误,则返回 arg 在[−π/2;+π/2][−π/2;+π/2] [- π/2 ; +π/2] 弧度范围中的弧(反)正切( arctan...

27460

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励