热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iframe嵌套页面_网络爬虫|网页中嵌套iframe框架内容爬取的两种思路

本文只介绍解决相应问题的解决思路,做技术分享,请勿滥用,否则后果自负。前言最近在网站看书的时候,遇到了一种iframe嵌套的
1e77223472759b2ae6238b5da2817311.png

本文只介绍解决相应问题的解决思路,做技术分享,请勿滥用,否则后果自负。

前言

最近在网站看书的时候,遇到了一种iframe嵌套的网站,然后就习惯性的考虑了进行数据获取的时候应该如何解决。

分析

进入网站点击下一页发现地址栏并不发生变化,但是改变地址栏的相应页面数字的时候小说的页数能够随着变化,我觉得很大可能是ajax绑定了数据。之后打开f12审查元素,又打开网页源码进行查看网页源码进行比较,发现f12审查元素中存在一个iframe标签,在这个iframe标签中存在小说相应的数据,如下图:

b91804b8d256575a1fed34788b17f905.png

之后查看源码中并不存在iframe相关的内容,只有一个form表单

d08ee33b87f180fbeb6d5bcf65794931.png

如果在这个状态下直接使用requests请求网址肯定是获取不到任何数据的,因为requests获取到的就是网站的源码。如果图省事的话可以直接考虑使用selenium,只要网站上看得到的都可以使用selenium进行获取,另外也是可以考虑使用requests进行分析network中各个请求进行获取数据。下面从两个角度对该问题进行解决。

思路一:使用requests获取数据

1.分析network

如果直接请求地址栏中的url是不可能获取到小说相关的内容的。因此先从network下手,看看点击下一页之后网站的发起请求的情况。点击下一页之后发现出现三个请求,并且出现了3?t=一串数字

c4456383c16540de455a8fc8f913805b.png

打开第一个文件发现里边的链接恰好就是下一个访问的链接

a67ba9a72a61f8a3d203bc128cd87e60.png

进入第二个链接发现里边的内容恰好就是小说内容

5415c23e7bc1955f06067a3e9f61bd0e.png

由此可以得出我们只要获取到第一个链接就可以得到小说的内容。

2.分析网页源码中的js部分

从1中我们得出只要能够获得链接1我们就能获取到数据,分析网页源码的目的也就是为了找到构造这个链接的js部分。首先肯定会考虑那个form表单,看看有什么用处,在里边的参数有一个${m}感觉有点像后端的EL表达式,数据是从后端传过来的。此路解决起来可能有点难度,继续看看其他的js方法,发现有一个方法里构造的url和我们在1中发现的第一个url极度相似

c1aa62923c81cbb812d106cab3aa2cb9.png

两个参数,一个pageIndex不用说了肯定是页码,但是这个t是什么,然后可以考虑在全局中搜索一下

92a27acc4cb323e02c7f88a98cadeae7.png

发现如下

a0d14ac65263f3c7b51fcf636e851b19.png

{t}仅仅是个字符,被一个方法替换了(new Date().getTime():获取时间戳),看这个方法应该是和时间有关系,那么t应该就是time的意思,然后去在线js执行一下方法

a5ee47a0d690609c7c67617b6cc8f723.png

3.构造url进行访问

用上边的时间戳构造url

9d8635f45ddade8f6aea0faed5db57d9.png

成功获取到信息

9ab69fed29191c9906742fcb515a46cd.png

现在url地址栏的信息则为1中的第二个链接

d16bd67dbce2b8f3162d5ba3a55b04fe.png

4.正则匹配url

使用requests进行请求的时候,看源码发现那个url与网站源码有些出入,按照requests请求后的源码解决即可。

0a9464e98869bad7690951099f83869d.png

把中间的jsessionid相关的东西匹配出来之后替换掉

04e67748991fe2f4828c432d73aebadf.png

于是就匹配出来了,之后使用replace换成相应的内容就可以了

代码如下:

import requests
import re
import time
from bs4 import BeautifulSoup
user_agent ="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
headers = {'User-Agent': user_agent}
url="http://shuxiang.chineseall.cn/v3/book/read/qDkFg/EPUB/1"
res=requests.get(url=url,headers=headers)
res_text=res.text
patterns='/v3/book/.+?t={t}'#Reader Url正则匹配规则
url_true=re.findall(patterns,res_text)#对整体进行匹配
re_text=re.findall(";.*?/",url_true[0])#匹配出来jsessionid
print(re_text[0])
print(url_true[0].replace(re_text[0],"/").replace("{pageIndex}","1").replace("{t}",str(int(time.time()))))#将链接中的jsessionid除去加入pagenumber以及时间戳
newurl="http://shuxiang.chineseall.cn"+url_true[0].replace(re_text[0],"/").replace("{pageIndex}","4").replace("{t}",str(int(time.time())))
result=requests.get(newurl,headers=headers)
print(result.text)
soup=BeautifulSoup(result.text,'lxml')
print(soup.find_all('p'))

运行结果:

256603d9a09aac2d9e74d000aa82ddab.png

思路二:使用selenium获取数据

1.找到iframe的class或者id

622b4da949357e567bd39b84626f3f2d.png

使用selenium中的switch_to.frame(id)就可以转达框架内进行操作

代码如下:

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver import ActionChainsb_driver = webdriver.Chrome()
url_str="http://shuxiang.chineseall.cn/v3/book/read/OtuGg/EPUB/"
url=[url_str+str(i)for i in range(2,8)]
#actions=ActionChains(b_driver)
f=open("D:研究数据爬取datatext.txt",'a')
def getTexts(url,urla):webdriver.Chrome()b_driver.get(url)b_driver.switch_to.frame('epubViewFrame')#转入iframe标签内page=b_driver.page_sourceprint(page)soup=BeautifulSoup(page,'lxml')soup_text=soup.select('p[class="content"]')for i in range(0,len(soup_text)):print(soup_text[i].string)if soup_text[i].string==None:f.write(" ")else:f.write(soup_text[i].string)f.write("n")f.write("*"*30+"n")b_driver.switch_to.window(b_driver.window_handles[-1])#使用新的标签进行访问下一个链接b_driver.get(urla)
for i in range(1,len(url)):if i==len(url):breakelse:getTexts(url[i],url[i+1])

效果如下:

d2b944bd91ac0c6f6d31aed58e27026e.png

总结

遇到需要爬取iframe内的信息网站的时候如果不要求时间的话完全可以使用selenium来爬取就可以,任何的js或者ajax对其都没有什么作用,但是如果有$cbc以及webdriver检测的话可能selenium就不行了。requests相对麻烦一些,因为需要抓包看一下相关的链接情况。最后还是要提醒一下,写任何的爬虫都不要给网站服务器造成负担,设置合理的休眠时间。

http://weixin.qq.com/r/dDnN1XzE9CGLrTi292xm (二维码自动识别)



推荐阅读
  • XMLhttpREquest_Ajax技术总结之XmlHttpRequest
    Ajax1、 什么是ajax   ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • ASP.NET&Spring.NET&NHibernate最佳实践(五)——第3章人事子系统(2)
    3.4.人事子系统服务层(Service)部门服务接口(IDeptService.cs)usingSystem;usingGuushuuse.SalaryPrj. ... [详细]
  • php设置数组大小_【大厂必备】2020超经典PHP面试题
    结合我自己这段时间的面试情况,面对的一些php面试题列举出来,基本上结合自己的看法回答的,不妥的地方请大家指出去,与大家一起 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
author-avatar
HAOCWH
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有