金秋临近,一年之中品尝螃蟹的好季节即将到来。但由于天气炎热,近期大闸蟹“食欲不振”,生长也受到了影响。然而,影响更深的是,由于高温,缺氧的大闸蟹“死伤严重”大闸蟹减产也导致其价格激增,今年大闸蟹价格比去年同期涨40%。大闸蟹一直都以来都比较贵,现在更是涨价,那估计很多人会被价格劝退吧? 关于大闸蟹的价格和销量我们今天可以作为一个爬虫实践项目,通过获取数据分析对比下今年的价格和销量有多大的变化。这里我们可以使用python爬取京东上的数据来进行分析,由于京东反爬技术较强,使用常规方法爬取其数据行不通,且使用逆向分析技术又具有一定难度,所以这次直接使用selenium爬取京东商品数据,并且在爬取的过程中还做了一系列反爬措施,比如随机ua,cookie,代理IP。代理IP是获取数据的重点,需要高高质量的代理,所以这里使用了由亿牛云提供的高质量隧道IP。使用过程也比较简单,示例如下: from selenium import webdriver import string import zipfile
1# 代理服务器(产品官网 www.16yun.cn) 2proxyHost = "t.16yun.cn" 3proxyPort = "31111" 4 5# 代理验证信息 6proxyUser = "username" 7proxyPass = "password" 8 9def create_proxy_auth_extension(proxy_host, proxy_port, 10 proxy_username, proxy_password, 11 scheme='http', plugin_path=None): 12 if plugin_path is None: 13 plugin_path = r'D:/{}_{}@t.16yun.zip'.format(proxy_username, proxy_password) 14 15 manifest_json = """ 16 { 17 "version": "1.0.0", 18 "manifest_version": 2, 19 "name": "16YUN Proxy", 20 "permissions": [ 21 "proxy", 22 "tabs", 23 "unlimitedStorage", 24 "storage", 25 "", 26 "webRequest", 27 "webRequestBlocking" 28 ], 29 "background": { 30 "scripts": ["background.js"] 31 }, 32 "minimum_chrome_version":"22.0.0" 33 } 34 """ 35 36 background_js = string.Template( 37 """ 38 var config = { 39 mode: "fixed_servers", 40 rules: { 41 singleProxy: { 42 scheme: "${scheme}", 43 host: "${host}", 44 port: parseInt(${port}) 45 }, 46 bypassList: ["foobar.com"] 47 } 48 }; 49 50 chrome.proxy.settings.set({value: config, scope: "regular"}, function() {}); 51 52 function callbackFn(details) { 53 return { 54 authCredentials: { 55 username: "${username}", 56 password: "${password}" 57 } 58 }; 59 } 60 61 chrome.webRequest.onAuthRequired.addListener( 62 callbackFn, 63 {urls: [""]}, 64 ['blocking'] 65 ); 66 """ 67 ).substitute( 68 host=proxy_host, 69 port=proxy_port, 70 username=proxy_username, 71 password=proxy_password, 72 scheme=scheme, 73 ) 74 75 with zipfile.ZipFile(plugin_path, 'w') as zp: 76 zp.writestr("manifest.json", manifest_json) 77 zp.writestr("background.js", background_js) 78 79 return plugin_path 80 81proxy_auth_plugin_path = create_proxy_auth_extension( 82 proxy_host=proxyHost, 83 proxy_port=proxyPort, 84 proxy_username=proxyUser, 85 proxy_password=proxyPass) 86 87option = webdriver.ChromeOptions() 88 89option.add_argument("--start-maximized") 90 91# 如报错 chrome-extensions 92# option.add_argument("--disable-extensions") 93 94option.add_extension(proxy_auth_plugin_path) 95 96# 关闭webdriver的一些标志 97# option.add_experimental_option('excludeSwitches', ['enable-automation']) 98 99driver = webdriver.Chrome(chrome_options=option) 100 101# 修改webdriver get属性 102# script = ''' 103# Object.defineProperty(navigator, 'webdriver', { 104# get: () => undefined 105# }) 106# ''' 107# driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script}) 108 109 110 111driver.get("http://httpbin.org/ip")
selenium的使用和其他的语言有很多的不同点,所以在找使用的时候需要特别的区别下,获取的数据后期经过处理分析后再分享给大家参考。
