python爬虫中“动态网页”如何爬取

经常会在一些爬虫群里面看到这样的提问,为什么用Python爬虫请求某个网页时,有时打印的数据不全或者什么数据都没有或者只有html骨架代码。这是因为涉及到了”动态网页数据“这个词了,简单而言,就是后台的数据不是请求网页链接时就已经将数据写入到相应的标签上了,而是利用ajax请求将后台的数据写入到相应的标签上。通常要得到这些数据,可以有两种方式,其一为找到这个ajax请求链接,然后访问这个链接,解析相应的json数据即可;另外一种是使用selenium访问这个网址,等待网页加载完之后,然后解析相应的html标签得到这些数据。 今天我们就来讲解下直接使用selenium模块访问当前网址,因为通过selenium访问网址时,是完全模拟浏览器进行访问的,因此,即使网页使用了ajax技术,selenium也能获取到相应的数据。selenium实现了一些类似xpath的功能,可以用driver直接获取我们想要的元素,直接调用下列方法,用pyquery方法解析的,相对要简单很多。

1 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item'))) 2 html = driver.page_source 3 doc = pq(html) 4 items = doc('#mainsrp-itemlist .items .item').items() 5 for item in items: 6 product = { 7 'image': item.find('.pic .img').attr('src'), 8 'price': item.find('.price').text(), 9 'deal': item.find('.deal-cnt').text()[:-3], 10 'title': item.find('.title').text(), 11 'shop': item.find('.shop').text(), 12 'location': item.find('.location').text() 13 } 14 print(product)

selenium还包括很多方法,在访问一些需要登陆的网站的时候我们可以使用selenium驱动浏览器进行操作。但是使用的过程中需要注意几点: 1、在开始爬取过程前,需要明确爬取目标和目标数据的结构。 2、使用合适的浏览器驱动:selenium需要一个浏览器驱动来控制浏览器,需要根据自己使用的浏览器版本下载相应版本的浏览器驱动。 3、设置合适的间隔时间:避免爬取过快导致封IP或者被识别为恶意爬虫,需要设置合适的间隔时间。 5、处理网页加载时的动态内容:对于需要模拟点击、滚动等动作才能显示出的网页内容,需要使用selenium提供的模拟点击、滚动等方法。 以下就是selenium加上Chrome版本>=92,并附带添加亿牛云代理IP的实现过程。

1 import string 2 import zipfile 3 4 # 代理服务器(产品官网 www.16yun.cn) 5 proxyHost = "t.16yun.cn" 6 proxyPort = "3111" 7 8 # 代理验证信息 9 proxyUser = "username" 10 proxyPass = "password" 11 12 13 def create_proxy_auth_extension(proxy_host, proxy_port, 14 proxy_username, proxy_password, 15 scheme='http', plugin_path=None): 16 if plugin_path is None: 17 plugin_path = r'/tmp/{}_{}@t.16yun.zip'.format(proxy_username, proxy_password) 18 19 manifest_json = """ 20 { 21 "version": "1.0.0", 22 "manifest_version": 2, 23 "name": "16YUN Proxy", 24 "permissions": [ 25 "proxy", 26 "tabs", 27 "unlimitedStorage", 28 "storage", 29 "<all_urls>", 30 "webRequest", 31 "webRequestBlocking" 32 ], 33 "background": { 34 "scripts": ["background.js"] 35 }, 36 "minimum_chrome_version":"22.0.0" 37 } 38 """ 39 40 background_js = string.Template( 41 """ 42 var config = { 43 mode: "fixed_servers", 44 rules: { 45 singleProxy: { 46 scheme: "${scheme}", 47 host: "${host}", 48 port: parseInt(${port}) 49 }, 50 bypassList: ["localhost"] 51 } 52 }; 53 54 chrome.proxy.settings.set({value: config, scope: "regular"}, function() {}); 55 56 function callbackFn(details) { 57 return { 58 authCredentials: { 59 username: "${username}", 60 password: "${password}" 61 } 62 }; 63 } 64 65 chrome.webRequest.onAuthRequired.addListener( 66 callbackFn, 67 {urls: ["<all_urls>"]}, 68 ['blocking'] 69 ); 70 """ 71 ).substitute( 72 host=proxy_host, 73 port=proxy_port, 74 username=proxy_username, 75 password=proxy_password, 76 scheme=scheme, 77 ) 78 print(background_js) 79 80 with zipfile.ZipFile(plugin_path, 'w') as zp: 81 zp.writestr("manifest.json", manifest_json) 82 zp.writestr("background.js", background_js) 83 84 return plugin_path 85 86 87 proxy_auth_plugin_path = create_proxy_auth_extension( 88 proxy_host=proxyHost, 89 proxy_port=proxyPort, 90 proxy_username=proxyUser, 91 proxy_password=proxyPass) 92 93 option = webdriver.ChromeOptions() 94 95 option.add_argument("--start-maximized") 96 97 # 如报错 chrome-extensions 98 # option.add_argument("--disable-extensions") 99 100 option.add_extension(proxy_auth_plugin_path) 101 102 # 关闭webdriver的一些标志 103 # option.add_experimental_option('excludeSwitches', ['enable-automation']) 104 105 driver = webdriver.Chrome( 106 chrome_options=option, 107 executable_path="./chromdriver" 108 ) 109 110 # 修改webdriver get属性 111 # script = ''' 112 # Object.defineProperty(navigator, 'webdriver', { 113 # get: () => undefined 114 # }) 115 # ''' 116 # driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script}) 117 118 119 driver.get("https://httpbin.org/ip") 120
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

创建免费ip代理池

&ensp;&ensp;&ensp;&ensp; 反爬技术越来越成熟,为了爬取目标数据,必须对爬虫的请求进行伪装,骗过目标系统,目标系统通过判断请求的访问频次或请求参数将疑似爬虫的ip进行封禁,要求进行安全验证,通过python的第三方库faker可以随机生成header伪装请求头,并且减缓爬虫的爬取速度,能很好的避过多数目标系统的反扒机制,但对一些安全等级

小伙Python爬虫并自制新闻网站,太好玩了

大家好,我又来了,我是银牌厨师豆腐!我们总是在爬啊爬,爬到了数据难道只是为了做一个词云吗?当然不!这次我就利用flask为大家呈现一道小菜。Flask是python中一个轻量级web框架,相对于其他web框架来说简单,适合小白练手。使用Flask爬虫,教大家如何实时展示自己爬下来的数据到网页上。先给大家展示一下这个丑丑的网页↓(给个面子,别笑)演示三

商业数据分析从入门到入职(9)Python网络数据获取

@toc前言本文主要讲Python最常见的应用之一——网络数据获取,即爬虫:先介绍了网页和网络的基础知识,为从网页中获取数据打好基础;接下来以两个案例介绍从网络中获取数据和处理数据的不同方式,以进一步认识Python爬虫和数据处理。一、网络和网页基础知识1.数据来源数据源有很多,可以从数据库中获取,可以从文件中获取,也可以从

爬虫

爬虫什么是爬虫使用编程语言所编写的一个用于爬取web或app数据的应用程序怎么爬取数据1.找到要爬取的目标网站、发起请求2.分析URL是如何变化的和提取有用的URL3.提取有用的数据爬虫数据能随便爬取吗?遵守robots.txt协议爬虫的分类通用网络爬虫百度,Google等搜索引擎,从一些初识的URL扩展到整个网站,主要为门户站点搜索引擎和大型网站服务采

50 行代码教你爬取猫眼电影 TOP100 榜所有信息

对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫架构中的HTML下载器、HTML解析器、数据存储器三大模块:HTML下载器:利用requests模块下载HTML网页;HTML解析器:利用re正则表达