当前位置: 首页 > 后端技术 > Python

Data-crawler-04动态网页抓取

时间:2023-03-26 17:04:15 Python

Data-crawler-04动态网页抓取你的时间有限,所以不要浪费时间过别人的生活。不要被教条所困——教条就是生活在别人思考的结果中。不要让别人意见的噪音淹没了你内心的声音。最重要的是,要有勇气跟随自己的内心和直觉。他们不知何故已经知道你真正想成为什么样的人。其他都是次要的——乔布斯数据系列:目录|配置|以上文字内容主要来自《Python网络爬虫从入门到实践》一书第四章,以及其网站给出的代码。本文采用两种方式(解析真实网页地址&使用selenium模拟浏览器)抓取动态网页。我们这里抓取的仍然是作者提供的个人网页。1.环境配置这次我们需要的库是requests、selenium和json。其中引入了requests,json是自带的。唯一需要配置的是selenium。同样一致的命令condainstall-ndata_env_37selenium就完成了。2、预备知识【动态页面】静态页面生成html代码后,页面内容和显示效果基本不会发生变化;而对于动态页面,虽然页面代码保持不变,但其显示内容会随着时间、环境或数据库操作的变化而变化,结果会有所不同。比如在使用JavaScript的时候,很多内容不会出现在html源码中,所以之前的爬取静态网页的方法可能就不行了。异步更新技术AJAX(AsynchronousJavascriptAndXML),是一种用于创建交互式、快速和动态网络应用程序的网络开发技术,它可以在不加载整个网页的情况下更新部分网页的内容。爬取动态网页有两种方法:解析真实地址;使用selenium模拟浏览器。[JSON]本次爬取的数据以JSON格式存储。JSON(JavaScriptObjectNotation,JSObjectNotation)是一种极其轻量级的数据交换格式。示例://示例1{"name":"Jack","age":18,"address":{"country":"china","zip-code":"10000"}}//示例2{"a":1,"b":[1,2,3]}//例3{"people":[{"firstName":"Jack","lastName":"Jobs"},{"firstName":"Tom","lastName":"Hunter"}]}[selenium库]selenium是一个自动化测试工具,支持Chrome、Firefox、Safari等浏览器。浏览器根据脚本代码进行打开、点击、输入、验证等操作,主要用于解决JS渲染的问题。用浏览器打开/关闭网页fromseleniumimportwebdrivebrowser=webdrive.Chrome()browser.get('https://www.XXX.com')browser.close()元素查找res=browser.find_element_by_id('id_info')#通过id查找res=browser.find_element_by_name('name_info')#通过name查找res=browser.find_element_by_class_name('class_name')res=browser.find_element_by_tag_name('tag_name')res=browser.find_element_by_xpath("//*[@id='id_info']")res=browser.find_element_by_xpath("//*[@name='name_info']")res=browser.find_element_by_xpath("//input[@class='class']")res=browser.find_element_by_xpath("/html/body/form")res=browser.find_element_by_xpath("//input[@id='id'and@name='name']")res=browser.find_element_by_css_selector("#id_info")res=browser.find_element_by_css_selector("[name=n]")res=browser.find_element_by_css_selector(".class_name")res=browser.find_element_by_css_selector("html>body>form")res=browser.find_element_by_link_text("hao123")res=browser.find_element_by_partial_link_text("hao123")查找多个元素和查找单个元素一样,只是函数名是find_elements_by_XXX浏览器控件browser.set_window_size(1400,800)#设置浏览器大小browser.back()#浏览器返回浏览器。forward()#浏览器转发browser.refresh()#刷新页面browser.clear()#清除文本browser.send_keys(value)#键盘输入element.click()#点击按钮submit()#提交表单get_attribute(name)#获取元素属性is_displayed()#设置元素是否可见size#Elementsizetext#ElementtextMouseevent:ActionChainsclassActionChains(Driver):Constructionobjectcontext_click():Mousehovermove_to_element(above):右键点击double_click():双击drag_and_drop():拖放move_to_element():移动context_click():右键perform():Performanoperationexamplefromseleniumimportwebdriver#1.从selenium.webdriver.common.action_chainsimportActionChains#2引入ActionChains类。打开网页driver=webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")driver.get("https://www.baidu.cn")#3。定位要悬停的元素element=driver.find_element_by_link_text("Settings")#4。对定位元素执行鼠标悬停操作ActionChains(driver).move_to_element(element).perform()键盘事件send_keys(value)执行valueKeys.BACK_SPACE删除键Keys.SPACE空格键Keys.TABKeys.ESCAPEKeys.ENTER组合键:send_keys(Keys.CONTROL,'c')3.方法一:解析真实地址【真实地址】进入爬取页面,右键勾选元素,点击网络,找到列表文件,如图,可以找到实际地址如3[地址分析]和上次一样,分析一下每个页面的地址,没错,第一页:https://api-zero.livere.com/v...第二页:https://api-zero。livere.com/v...第三页:https://api-zero.livere.com/v...可以找到关键字limit和offset,NICE[存储格式]另外,当我们打开内容的真实地址,可以发现它的存储格式是JSON,如下图,可以知道我们要获取的数据在content下[代码]分析网页信息后,解析类似静态网页抓取。#导入库importrequestsimportjsonmessages=[]#1.获取页面标题={'user-agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_15_4)AppleWebKit/605.1.15(KHTML,likeGecko)Version/13.1Safari/605.1.15'}foriinrange(1,4):url='https://api-zero.livere.com/v1/comments/list?callback=jQuery1124004614198129784364_1586852914458&limit=10&offset='\+str(i)+'&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&code=&_=1586852914467'response=requests.get(url,headers=headers,timeout=15)str('ipage:',print(+1),';status',response.status_code)#2。解析页面json_string=response.textjson_string=json_string[json_string.find('{'):-2]#提取第一个{,最后两个字符}和;未取json_data=json.loads(json_string)comment_list=json_data['results']['parents']#JSON在最上面有这两个标志,图片不显示,可以在comment_list:messages中查看评论。追加(评论['内容'].strip())#3。写入文件open('04_comments_1.txt','a+')asf:formessageinmessages:f.write(message+'\n--------------------------\n')print('Complete')4.方法二:模拟浏览器抓取【分析网页】我们使用Safari开发工具分析想要获取的位置数据显示在3处【代码】这里是最简单的代码实现com/2018/07/04/hello-world/")time.sleep(5)print('滑动到底部')driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")print('getdata')driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))comments=driver.find_elements_by_css_selector('div.reply-content')对于评论中的每个评论:content=eachcomment.find_element_by_tag_name('p')print(content.text)driver.close()【补充】作者文章中,方法给出了限制图片加载、JS渲染、移动页面、点击按钮等操作的od。Safari上使用不方便,还有评论区按钮的功能,不再实现。可以参考作者的代码,也可以按照第二部分selenium库的介绍自己实现。参考资料Python网络爬虫从入门到实践第4章爬虫书籍代码百度百科:JSON基础Selenium库使用python爬虫---selenium库使用使用seleniumwebdriver打开Safari浏览器