
python抓取动态网页
python抓取动态网页(使用selenium爬取动态网页信息Pythonselenium自动控制 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2021-12-19 13:26
)
使用selenium抓取动态网页信息
Python selenium自动控制浏览器抓取网页的数据,包括按钮点击、页面跳转、搜索框输入、页面值数据存储、mongodb自动id识别等。
首先介绍一下Python selenium——一种用于控制浏览器对网页操作的自动化测试工具。将它与爬虫中的 BeautifulSoup 结合起来是无缝的。除了国外的一些异常的验证网页,图片验证码我有自己的破解码。图片验证码源代码成功率为85%。
使用 conda butler 安装:
在cmd命令行输入“conda install selenium”进行安装
您还需要安装 Google Chrome Drive 或 Firefox 浏览器插件
设置环境变量
通过硒访问百度
from selenium import webdriver
#打开一个浏览器
browser = webdriver.Chrome()
#准备一个网址
url = 'http://www.baidu.com'
browser.get(url)
#获取元素
login = browser.find_elements_by_class_name('lb')[0]
print(login)
获取网易云音乐
from selenium import webdriver
#打开浏览器
brower = webdriver.Chrome()
url='https://music.163.com/#/discover/toplist'
brower.get(url)
#寻找logo文字
#logo = brower.find_elements_by_class_name('logo')[0]
#print(logo.text)
#一般情况下动态加载的内容都可以找到
#有一种情况就没有
#就是网页内存在网页框架iframe
#需要切换网页的层级
#语法:brower.switch_to.frame(iframe的id或者你提前获取这个对象,放入此处)
#方法一:id
#brower.switch_to.frame('g_iframe')
#方法二:name
#brower.switch_to.frame('contentFrame')
#方法三:提前用变量存iframe
iframe = brower.find_element_by_id('g_iframe')
brower.switch_to.frame(iframe)
#寻找大容器
toplist = brower.find_element_by_id('toplist')
#寻找tbody 通过标签名
tbody = toplist.find_elements_by_tag_name('tbody')[0]
#寻找所有tr
trs = tbody.find_elements_by_tag_name('tr')
dataList = []
for each in trs:
#排名
rank = each.find_elements_by_tag_name('td')[0].find_elements_by_class_name('num')[0].text
musicName = each.find_elements_by_tag_name('td')[1].find_elements_by_class_name('txt')[0].\
find_element_by_tag_name('b').get_attribute('title')
#print(musicName)
singer = each.find_elements_by_tag_name('td')[3].find_elements_by_class_name('text')[0].\
get_attribute('title')
#print(singer)
dataList.append([rank,musicName,singer])
#print(dataList)
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = '云音乐飙升榜'
ws.append(['排名','歌名','歌手'])
for data in dataList:
ws.append(data)
wb.save("云音乐飙升榜.xlsx") 查看全部
python抓取动态网页(使用selenium爬取动态网页信息Pythonselenium自动控制
)
使用selenium抓取动态网页信息
Python selenium自动控制浏览器抓取网页的数据,包括按钮点击、页面跳转、搜索框输入、页面值数据存储、mongodb自动id识别等。
首先介绍一下Python selenium——一种用于控制浏览器对网页操作的自动化测试工具。将它与爬虫中的 BeautifulSoup 结合起来是无缝的。除了国外的一些异常的验证网页,图片验证码我有自己的破解码。图片验证码源代码成功率为85%。
使用 conda butler 安装:
在cmd命令行输入“conda install selenium”进行安装
您还需要安装 Google Chrome Drive 或 Firefox 浏览器插件
设置环境变量
通过硒访问百度
from selenium import webdriver
#打开一个浏览器
browser = webdriver.Chrome()
#准备一个网址
url = 'http://www.baidu.com'
browser.get(url)
#获取元素
login = browser.find_elements_by_class_name('lb')[0]
print(login)
获取网易云音乐
from selenium import webdriver
#打开浏览器
brower = webdriver.Chrome()
url='https://music.163.com/#/discover/toplist'
brower.get(url)
#寻找logo文字
#logo = brower.find_elements_by_class_name('logo')[0]
#print(logo.text)
#一般情况下动态加载的内容都可以找到
#有一种情况就没有
#就是网页内存在网页框架iframe
#需要切换网页的层级
#语法:brower.switch_to.frame(iframe的id或者你提前获取这个对象,放入此处)
#方法一:id
#brower.switch_to.frame('g_iframe')
#方法二:name
#brower.switch_to.frame('contentFrame')
#方法三:提前用变量存iframe
iframe = brower.find_element_by_id('g_iframe')
brower.switch_to.frame(iframe)
#寻找大容器
toplist = brower.find_element_by_id('toplist')
#寻找tbody 通过标签名
tbody = toplist.find_elements_by_tag_name('tbody')[0]
#寻找所有tr
trs = tbody.find_elements_by_tag_name('tr')
dataList = []
for each in trs:
#排名
rank = each.find_elements_by_tag_name('td')[0].find_elements_by_class_name('num')[0].text
musicName = each.find_elements_by_tag_name('td')[1].find_elements_by_class_name('txt')[0].\
find_element_by_tag_name('b').get_attribute('title')
#print(musicName)
singer = each.find_elements_by_tag_name('td')[3].find_elements_by_class_name('text')[0].\
get_attribute('title')
#print(singer)
dataList.append([rank,musicName,singer])
#print(dataList)
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = '云音乐飙升榜'
ws.append(['排名','歌名','歌手'])
for data in dataList:
ws.append(data)
wb.save("云音乐飙升榜.xlsx")
python抓取动态网页(Python网络爬虫内容提取器)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-19 04:05
1、简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2、提取动态内容的技术组件
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是部分Ajax动态内容在源码中是找不到的,需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码和实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
第一步:利用直观的采集搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面即可在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub上找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取
4、阅读下一个
到目前为止,我们已经通过两篇文章 文章演示了如何抓取静态和动态的网页内容,这两篇文章都使用xslt 一次性从网页中提取所需的内容。实际上,xslt 是一种更复杂的编程语言。如果你手工写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这就说得通了,程序员不再花时间编写和调试捕获规则,这是一项非常耗时费力的工作。下一篇《1分钟快速生成用于Web内容提取的Xslt》将介绍如何生成xslt。
5、Jisouke GooSeeker开源代码下载源码
1. GooSeeker开源Python网络爬虫GitHub源码
6、文档修订历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源,修改github源码地址 查看全部
python抓取动态网页(Python网络爬虫内容提取器)
1、简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2、提取动态内容的技术组件
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是部分Ajax动态内容在源码中是找不到的,需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码和实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:

第一步:利用直观的采集搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面即可在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。

第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub上找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取

4、阅读下一个
到目前为止,我们已经通过两篇文章 文章演示了如何抓取静态和动态的网页内容,这两篇文章都使用xslt 一次性从网页中提取所需的内容。实际上,xslt 是一种更复杂的编程语言。如果你手工写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这就说得通了,程序员不再花时间编写和调试捕获规则,这是一项非常耗时费力的工作。下一篇《1分钟快速生成用于Web内容提取的Xslt》将介绍如何生成xslt。
5、Jisouke GooSeeker开源代码下载源码
1. GooSeeker开源Python网络爬虫GitHub源码
6、文档修订历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源,修改github源码地址
python抓取动态网页(如何用python来抓取页面中的JS动态加载的数据 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2021-12-18 05:14
)
我们经常发现网页中的很多数据并不是硬编码在HTML中,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前是没有的。
在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果你还是直接从网页上爬取,你将无法获取任何数据。
今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
如下图,我们在HTML中找不到对应的电影信息。
在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:
在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
我们可以看到它使用了AJAX异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某一部分,从而实现数据的动态加载。
我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。
查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然,它们的意思是:“从某个位置返回的电影数量”。
如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
但这看起来很不自动化,很多其他的网站 RequestURL 没有那么简单,所以我们将使用python 进行进一步的操作,以获取返回的消息信息。
#coding:utf-8
import urllib
import requests
post_param = {'action':'','start':'0','limit':'1'}
return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False)
print return_data.text 查看全部
python抓取动态网页(如何用python来抓取页面中的JS动态加载的数据
)
我们经常发现网页中的很多数据并不是硬编码在HTML中,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前是没有的。
在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果你还是直接从网页上爬取,你将无法获取任何数据。
今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
如下图,我们在HTML中找不到对应的电影信息。


在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:

在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
我们可以看到它使用了AJAX异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某一部分,从而实现数据的动态加载。

我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。

查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然,它们的意思是:“从某个位置返回的电影数量”。
如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
但这看起来很不自动化,很多其他的网站 RequestURL 没有那么简单,所以我们将使用python 进行进一步的操作,以获取返回的消息信息。
#coding:utf-8
import urllib
import requests
post_param = {'action':'','start':'0','limit':'1'}
return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False)
print return_data.text
python抓取动态网页(利用selenium的子模块webdriver的html内容解决的问题)
网站优化 • 优采云 发表了文章 • 0 个评论 • 34 次浏览 • 2021-12-18 05:12
文章目的
我们在使用Python爬取网页数据时,经常会用到urllib模块,它通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获取网页的html内容url,然后使用 BeautifulSoup 抓取某个 Label 内容,结合正则表达式过滤。但是,您使用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容。很多动态数据(比如网站访问量、当前在线数、微博点赞数等)都没有收录在静态html中,比如我想在里面抓取每个版块的当前在线数这个bbs网站,不收录静态html网页(不信你去查一下页面的源码,只有简单的一行)。
解决方案
我试过网上说的用浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具)查看网络获取动态数据的趋势,但这需要从许多网址。个人觉得太麻烦。另外,查看器查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何将查看器的html导入python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
偶然发现了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,找到当前session对应的tag。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一些重要的动态数据。事实上,selenium 模块的功能不仅限于抓取网页。它是自动化网络测试的常用模块。它在 Ruby 和 Java 中被广泛使用。Python虽然使用的相对较少,但它也是一个非常简单、高效、易用的自动化测试。模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,你也可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
实现流程运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有自带selenium,直接在Python程序中导入selenium会提示没有这样的模块,在联网状态下,cmd直接进入pip install selenium,系统会找到Python安装目录,直接下载解压安装这个模块。终端提示完成后,可以查看C:\Python27\Lib\site-packages目录下是否有selenium模块。这个目录取决于你安装 Python 的路径。如果有 selenium 和 selenium-2.47.3.dist-info 两个文件夹,则可以在 Python 程序中加载模块。
使用 webdriver 捕获动态数据
1.首先导入webdriver子模块
从硒导入网络驱动程序
2.获取浏览器会话,浏览器可以使用火狐、Chrome、IE等,这里以火狐为例
浏览器 = webdriver.Firefox()
3.加载页面,只需在url中指定一个有效字符串
browser.get(url)
4. 获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
名称
班级名称
关联
文本
部分的
关联
文本
标签
名称
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考《博客园-冲实》大神的selenium webdriver(python)教程第三章-定位方法(第一版可百度文库阅读,第二版为开始收费 >- 查看全部
python抓取动态网页(利用selenium的子模块webdriver的html内容解决的问题)
文章目的
我们在使用Python爬取网页数据时,经常会用到urllib模块,它通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获取网页的html内容url,然后使用 BeautifulSoup 抓取某个 Label 内容,结合正则表达式过滤。但是,您使用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容。很多动态数据(比如网站访问量、当前在线数、微博点赞数等)都没有收录在静态html中,比如我想在里面抓取每个版块的当前在线数这个bbs网站,不收录静态html网页(不信你去查一下页面的源码,只有简单的一行)。
解决方案
我试过网上说的用浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具)查看网络获取动态数据的趋势,但这需要从许多网址。个人觉得太麻烦。另外,查看器查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何将查看器的html导入python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
偶然发现了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,找到当前session对应的tag。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一些重要的动态数据。事实上,selenium 模块的功能不仅限于抓取网页。它是自动化网络测试的常用模块。它在 Ruby 和 Java 中被广泛使用。Python虽然使用的相对较少,但它也是一个非常简单、高效、易用的自动化测试。模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,你也可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
实现流程运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有自带selenium,直接在Python程序中导入selenium会提示没有这样的模块,在联网状态下,cmd直接进入pip install selenium,系统会找到Python安装目录,直接下载解压安装这个模块。终端提示完成后,可以查看C:\Python27\Lib\site-packages目录下是否有selenium模块。这个目录取决于你安装 Python 的路径。如果有 selenium 和 selenium-2.47.3.dist-info 两个文件夹,则可以在 Python 程序中加载模块。
使用 webdriver 捕获动态数据
1.首先导入webdriver子模块
从硒导入网络驱动程序
2.获取浏览器会话,浏览器可以使用火狐、Chrome、IE等,这里以火狐为例
浏览器 = webdriver.Firefox()
3.加载页面,只需在url中指定一个有效字符串
browser.get(url)
4. 获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
名称
班级名称
关联
文本
部分的
关联
文本
标签
名称
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考《博客园-冲实》大神的selenium webdriver(python)教程第三章-定位方法(第一版可百度文库阅读,第二版为开始收费 >-
python抓取动态网页( 为啥写这篇文章?前两篇文章我们分别介绍了文章目录分析页面)
网站优化 • 优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2021-12-16 10:08
为啥写这篇文章?前两篇文章我们分别介绍了文章目录分析页面)
为什么要写这个文章?
我们介绍了前两个文章
文章内容
分析页面
首先打开小餐桌网站。经过简单的分析,我们可以得出三个结论。
点击查看更多数据后,页面地址不变,页面不会刷新。单击以查看更多一次将请求一个界面。页面的数据以application/json的形式由接口返回。p 参数控制返回哪一页数据。n 参数控制每页返回的数据项数。什么是阿贾克斯
AJAX(Asynchronouse JavaScript And XML)中文称为异步JavaScript和XML。主要用于前端和服务器端进行少量数据交互。Ajax 可以实现网页的异步加载,这意味着可以在不重新加载整个网页的情况下部分更新网页的某个部分。如果内容需要更新,传统网页(不使用 Ajax)需要重新加载整个网页。
因为传统的数据传输格式是XML语法,所以称为AJAX。其实现在数据交互基本都是用JSON。使用ajax加载的数据,即使使用js,数据渲染到浏览器中,右键---->查看网页源码,仍然看不到通过ajax加载的数据,只加载了html带有网址代码。
获取ajax数据的方法直接分析ajax调用的接口,然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。(下面文章会详细介绍)获取数据
这个小饭桌网站的界面比较简单,没有加密认证什么的,直接通过requests请求即可。下面给出了一个示例代码:
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"
}
requests.packages.urllib3.disable_warnings()
if __name__ == '__main__':
for i in range(1,10):
url = "https://www.xfz.cn/api/website/articles/?p={0}&n=20&type=".format(str(i))
resp = requests.get(url, headers=headers, verify=False)
print(resp.json())
操作结果:
总结
本文以小凡表网站为例,简单介绍一下如何抓取动态网页的数据。
粉丝专属福利
软试材料:实用软试材料
面试题:5G Java高频面试题
学习资料:各种学习资料50G 查看全部
python抓取动态网页(
为啥写这篇文章?前两篇文章我们分别介绍了文章目录分析页面)

为什么要写这个文章?
我们介绍了前两个文章
文章内容
分析页面
首先打开小餐桌网站。经过简单的分析,我们可以得出三个结论。

点击查看更多数据后,页面地址不变,页面不会刷新。单击以查看更多一次将请求一个界面。页面的数据以application/json的形式由接口返回。p 参数控制返回哪一页数据。n 参数控制每页返回的数据项数。什么是阿贾克斯
AJAX(Asynchronouse JavaScript And XML)中文称为异步JavaScript和XML。主要用于前端和服务器端进行少量数据交互。Ajax 可以实现网页的异步加载,这意味着可以在不重新加载整个网页的情况下部分更新网页的某个部分。如果内容需要更新,传统网页(不使用 Ajax)需要重新加载整个网页。
因为传统的数据传输格式是XML语法,所以称为AJAX。其实现在数据交互基本都是用JSON。使用ajax加载的数据,即使使用js,数据渲染到浏览器中,右键---->查看网页源码,仍然看不到通过ajax加载的数据,只加载了html带有网址代码。
获取ajax数据的方法直接分析ajax调用的接口,然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。(下面文章会详细介绍)获取数据
这个小饭桌网站的界面比较简单,没有加密认证什么的,直接通过requests请求即可。下面给出了一个示例代码:
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"
}
requests.packages.urllib3.disable_warnings()
if __name__ == '__main__':
for i in range(1,10):
url = "https://www.xfz.cn/api/website/articles/?p={0}&n=20&type=".format(str(i))
resp = requests.get(url, headers=headers, verify=False)
print(resp.json())
操作结果:

总结
本文以小凡表网站为例,简单介绍一下如何抓取动态网页的数据。
粉丝专属福利
软试材料:实用软试材料
面试题:5G Java高频面试题
学习资料:各种学习资料50G
python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)
网站优化 • 优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-14 20:38
用python爬取网站数据很方便,效率也很高,但是常用的BeautifSoup和requests的组合一般用于爬取静态页面(即网页上显示的数据)可以在html源码中找到,不是网站通过js或者ajax异步加载的),这种网站数据比较容易爬取。但是网站上的一些数据是通过执行js代码更新的。这时候,传统的方法就不那么适用了。这种情况下有几种方法:
清除网页上的网络信息,更新页面,观察网页发送的请求。一些网站可以通过这种方式构造参数来简化爬虫。但适用范围还不够广。
使用 selenium 模拟浏览器行为来更新网页以获得更新的数据。本文的其余部分将重点介绍这种方法。
一、准备
需要两个工具来模拟浏览器:
1.selenium,可以直接通过pip install selenium安装。
2.PhantomJS,这是一个无界面、脚本可编程的 WebKit 浏览器引擎。百度从其官方网站搜索并下载。下载后,无需安装。放在指定的路径。您只需要指定文件所在的路径即可。
二、使用selenium模拟浏览器
本文爬取网站的例子是:8099/ths-report/...
学习示例时请不要抓取太多页面,只需通过过程了解如何抓取它。
打开网站后可以看到要爬取的数据是一个普通的表,但是页面很多。
在这个网站中,点击下一页的页面的url没有变化,通过执行一段js代码来更新页面。所以本文的思路是用selenium模拟浏览器点击,点击“下一步”更新页面数据,获取更新后的页面数据。这是完整的代码:
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import json
import time
from selenium import webdriver
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
curpath=sys.path[0]
print curpath
def getData(url):
# 使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便
driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")
driver.set_page_load_timeout(30)
time.sleep(3)
html=driver.get(url[0]) # 使用get方法请求url,因为是模拟浏览器,所以不需要headers信息
for page in range(3):
html=driver.page_source # 获取网页的html数据
soup=BeautifulSoup(html,'lxml') # 对html进行解析,如果提示lxml未安装,直接pip install lxml即可
table=soup.find('table',class_="report-table")
name=[]
for th in table.find_all('tr')[0].find_all('th'):
name.append(th.get_text()) # 获取表格的字段名称作为字典的键
flag=0 # 标记,当爬取字段数据是为0,否则为1
for tr in table.find_all('tr'):
# 第一行为表格字段数据,因此跳过第一行
if flag==1:
dic={}
i=0
for td in tr.find_all('td'):
dic[name[i]]=td.get_text()
i+=1
jsonDump(dic,url[1])#保存数据
flag=1
# 利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可
driver.find_element_by_link_text(u"下一页").click()
def jsonDump(_json,name):
"""store json data"""
with open(curpath+'/'+name+'.json','a') as outfile:
json.dump(_json,outfile,ensure_ascii=False)
with open(curpath+'/'+name+'.json','a') as outfile:
outfile.write(',\n')
if __name__ == '__main__':
url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc'] # yzc为文件名,此处输入中文会报错,前面加u也不行,只好保存后手动改文件名……
getData(url) # 调用函数
复制代码
本文通过driver.find_element_by_link_text方法获取下一页的位置。这是因为在这个网页中,这个标签没有唯一可识别的 id,也没有类。如果是通过xpath定位,第一页和其他页面的xpath路径不完全一样,需要加一个if来判断。所以直接通过链接的text参数进行定位。click() 函数模拟浏览器中的点击操作。
硒非常强大。可以解决很多普通爬虫无法解决的问题。可以模拟点击、鼠标移动、提交表单(应用如:登录邮箱账号、登录wifi等,网上例子很多,我暂时还没试过),当你遇到一些非常规网站数据爬取难度很大,不妨试试selenium+phantomjs。
最后:【可以帮到你】
这个资料应该是【软件测试】的朋友们最全面、最全的准备库了。这个仓库陪伴了数以万计的测试工程师走过最艰难的旅程,也希望能帮到你!关注我的微信公众号【软件测试道】免费获取~
我的学习交流群:644956177群内有技术高手交流分享~
如果我的博客对你有帮助,如果你喜欢我的博客内容,请一键“点赞”“评论”“采集”! 查看全部
python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)
用python爬取网站数据很方便,效率也很高,但是常用的BeautifSoup和requests的组合一般用于爬取静态页面(即网页上显示的数据)可以在html源码中找到,不是网站通过js或者ajax异步加载的),这种网站数据比较容易爬取。但是网站上的一些数据是通过执行js代码更新的。这时候,传统的方法就不那么适用了。这种情况下有几种方法:
清除网页上的网络信息,更新页面,观察网页发送的请求。一些网站可以通过这种方式构造参数来简化爬虫。但适用范围还不够广。
使用 selenium 模拟浏览器行为来更新网页以获得更新的数据。本文的其余部分将重点介绍这种方法。
一、准备
需要两个工具来模拟浏览器:
1.selenium,可以直接通过pip install selenium安装。
2.PhantomJS,这是一个无界面、脚本可编程的 WebKit 浏览器引擎。百度从其官方网站搜索并下载。下载后,无需安装。放在指定的路径。您只需要指定文件所在的路径即可。
二、使用selenium模拟浏览器
本文爬取网站的例子是:8099/ths-report/...
学习示例时请不要抓取太多页面,只需通过过程了解如何抓取它。
打开网站后可以看到要爬取的数据是一个普通的表,但是页面很多。
在这个网站中,点击下一页的页面的url没有变化,通过执行一段js代码来更新页面。所以本文的思路是用selenium模拟浏览器点击,点击“下一步”更新页面数据,获取更新后的页面数据。这是完整的代码:
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import json
import time
from selenium import webdriver
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
curpath=sys.path[0]
print curpath
def getData(url):
# 使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便
driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")
driver.set_page_load_timeout(30)
time.sleep(3)
html=driver.get(url[0]) # 使用get方法请求url,因为是模拟浏览器,所以不需要headers信息
for page in range(3):
html=driver.page_source # 获取网页的html数据
soup=BeautifulSoup(html,'lxml') # 对html进行解析,如果提示lxml未安装,直接pip install lxml即可
table=soup.find('table',class_="report-table")
name=[]
for th in table.find_all('tr')[0].find_all('th'):
name.append(th.get_text()) # 获取表格的字段名称作为字典的键
flag=0 # 标记,当爬取字段数据是为0,否则为1
for tr in table.find_all('tr'):
# 第一行为表格字段数据,因此跳过第一行
if flag==1:
dic={}
i=0
for td in tr.find_all('td'):
dic[name[i]]=td.get_text()
i+=1
jsonDump(dic,url[1])#保存数据
flag=1
# 利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可
driver.find_element_by_link_text(u"下一页").click()
def jsonDump(_json,name):
"""store json data"""
with open(curpath+'/'+name+'.json','a') as outfile:
json.dump(_json,outfile,ensure_ascii=False)
with open(curpath+'/'+name+'.json','a') as outfile:
outfile.write(',\n')
if __name__ == '__main__':
url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc'] # yzc为文件名,此处输入中文会报错,前面加u也不行,只好保存后手动改文件名……
getData(url) # 调用函数
复制代码
本文通过driver.find_element_by_link_text方法获取下一页的位置。这是因为在这个网页中,这个标签没有唯一可识别的 id,也没有类。如果是通过xpath定位,第一页和其他页面的xpath路径不完全一样,需要加一个if来判断。所以直接通过链接的text参数进行定位。click() 函数模拟浏览器中的点击操作。
硒非常强大。可以解决很多普通爬虫无法解决的问题。可以模拟点击、鼠标移动、提交表单(应用如:登录邮箱账号、登录wifi等,网上例子很多,我暂时还没试过),当你遇到一些非常规网站数据爬取难度很大,不妨试试selenium+phantomjs。
最后:【可以帮到你】
这个资料应该是【软件测试】的朋友们最全面、最全的准备库了。这个仓库陪伴了数以万计的测试工程师走过最艰难的旅程,也希望能帮到你!关注我的微信公众号【软件测试道】免费获取~
我的学习交流群:644956177群内有技术高手交流分享~
如果我的博客对你有帮助,如果你喜欢我的博客内容,请一键“点赞”“评论”“采集”!
python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-09 23:16
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:
可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:
然后直接点一个进去,复制url(右键复制链接地址)看看是什么:
原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l 查看全部
python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:

可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:

然后直接点一个进去,复制url(右键复制链接地址)看看是什么:

原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l
python抓取动态网页( Python将生成视频的缩略图内容类型的输出-教程)
网站优化 • 优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-12-09 07:20
Python将生成视频的缩略图内容类型的输出-教程)
r=requests.get(url, allow_redirects=True)
现在,我们可以获得有关 Web 服务器可以提供的内容的信息类型。
for headers in r.headers: print(headers)
您可以观察输出,如下所示 -
Date
Server
Upgrade
Connection
Last-Modified
Accept-Ranges
Content-Length
Keep-Alive
Content-Type
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如 content-type-
print (r.headers.get('content-type'))
您可以观察输出,如下所示 -
image/jpeg
借助以下几行代码,我们可以获得内容类型的具体信息,例如EType-
print (r.headers.get('ETag'))
您可以观察输出,如下所示 -
None
遵守以下命令——
print (r.headers.get('content-length'))
您可以观察输出,如下所示 -
12636
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如Server-
print (r.headers.get('Server'))
您可以观察输出,如下所示 -
Apache
生成缩略图
缩略图是非常小的描述或表示。用户可能只想保存大图像的缩略图,或者同时保存图像和缩略图。在本节中,我们将为上一节“从 Web 获取媒体内容”中下载的名为 ThinkBig.png 的图像创建缩略图。
对于这个 Python 脚本,我们需要安装一个名为 Pillow 的 Python 库,它是 Python Image 库的一个分支,具有处理图像的有用功能。
pip install pillow
以下 Python 脚本将创建图像的缩略图,并通过在缩略图文件前添加 Th _ 将其保存在当前目录中。
五牙教程网
import glob
from PIL import Image
for infile in glob.glob("ThinkBig.png"):
img=Image.open(infile)
img.thumbnail((128, 128), Image.ANTIALIAS)
if infile[0:2] != "Th_":
img.save("Th_" + infile, "png")
上面的代码很容易理解,可以查看当前目录下的缩略图文件。
网站 截图
在网络爬虫中,一个很常见的任务就是对网站进行截图。为了实现这一点,我们将使用 selenium 的 webdriver。以下 Python 脚本将从 网站 中截取屏幕截图并将其保存到当前目录。
From selenium import webdriver
path=r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser=webdriver.Chrome(executable_path=path)
browser.get('https://learnfk.com/')
screenshot=browser.save_screenshot('screenshot.png')
browser.quit
您可以观察输出,如下所示 -
DevTools listening on ws://127.0.0.1:1456/devtools/browser/488ed704-9f1b-44f0-
a571-892dc4c90eb7
运行脚本后,可以查看当前目录下的 screenshot.png 文件。
视频缩略图
假设我们已经从 网站 下载了一个视频,并且想要为其生成缩略图,以便我们可以根据其缩略图点击特定视频。要为视频生成缩略图,我们需要一个名为 ffmpeg 的简单工具,可以从 下载。下载后,我们需要根据操作系统的规格进行安装。
以下 Python 脚本将生成视频的缩略图并将其保存到我们的本地目录 -
import subprocess
video_MP4_file=“C:\Users\gaurav\desktop\solar.mp4
thumbnail_image_file='thumbnail_solar_video.jpg'
subprocess.call(['ffmpeg', '-i', video_MP4_file, '-ss', '00:00:20.000', '-
vframes', '1', thumbnail_image_file, "-y"])
运行上述脚本后,我们会得到一个名为thumbnail_solar_video.jpg 的缩略图,并将其保存在本地目录中。
MP4 转 MP3
假设你已经从网站下载了一些视频文件,但是只需要文件中的音频就可以使用,可以使用Python库中的moviepy这个Python库来完成这个操作,可以在帮助下安装以下命令的 -
pip install moviepy
现在,在以下脚本的帮助下成功安装moviepy后,我们可以将MP4转换为MP3。
import moviepy.editor as mp
clip=mp.VideoFileClip(r"C:\Users\gaurav\Desktop\1234.mp4")
clip.audio.write_audiofile("movie_audio.mp3")
您可以观察输出,如下所示 -
<p>[MoviePy] Writing audio in movie_audio.mp3
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 674/674 [00:01 查看全部
python抓取动态网页(
Python将生成视频的缩略图内容类型的输出-教程)
r=requests.get(url, allow_redirects=True)
现在,我们可以获得有关 Web 服务器可以提供的内容的信息类型。
for headers in r.headers: print(headers)
您可以观察输出,如下所示 -
Date
Server
Upgrade
Connection
Last-Modified
Accept-Ranges
Content-Length
Keep-Alive
Content-Type
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如 content-type-
print (r.headers.get('content-type'))
您可以观察输出,如下所示 -
image/jpeg
借助以下几行代码,我们可以获得内容类型的具体信息,例如EType-
print (r.headers.get('ETag'))
您可以观察输出,如下所示 -
None
遵守以下命令——
print (r.headers.get('content-length'))
您可以观察输出,如下所示 -
12636
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如Server-
print (r.headers.get('Server'))
您可以观察输出,如下所示 -
Apache
生成缩略图
缩略图是非常小的描述或表示。用户可能只想保存大图像的缩略图,或者同时保存图像和缩略图。在本节中,我们将为上一节“从 Web 获取媒体内容”中下载的名为 ThinkBig.png 的图像创建缩略图。
对于这个 Python 脚本,我们需要安装一个名为 Pillow 的 Python 库,它是 Python Image 库的一个分支,具有处理图像的有用功能。
pip install pillow
以下 Python 脚本将创建图像的缩略图,并通过在缩略图文件前添加 Th _ 将其保存在当前目录中。
五牙教程网
import glob
from PIL import Image
for infile in glob.glob("ThinkBig.png"):
img=Image.open(infile)
img.thumbnail((128, 128), Image.ANTIALIAS)
if infile[0:2] != "Th_":
img.save("Th_" + infile, "png")
上面的代码很容易理解,可以查看当前目录下的缩略图文件。
网站 截图
在网络爬虫中,一个很常见的任务就是对网站进行截图。为了实现这一点,我们将使用 selenium 的 webdriver。以下 Python 脚本将从 网站 中截取屏幕截图并将其保存到当前目录。
From selenium import webdriver
path=r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser=webdriver.Chrome(executable_path=path)
browser.get('https://learnfk.com/')
screenshot=browser.save_screenshot('screenshot.png')
browser.quit
您可以观察输出,如下所示 -
DevTools listening on ws://127.0.0.1:1456/devtools/browser/488ed704-9f1b-44f0-
a571-892dc4c90eb7
运行脚本后,可以查看当前目录下的 screenshot.png 文件。
视频缩略图
假设我们已经从 网站 下载了一个视频,并且想要为其生成缩略图,以便我们可以根据其缩略图点击特定视频。要为视频生成缩略图,我们需要一个名为 ffmpeg 的简单工具,可以从 下载。下载后,我们需要根据操作系统的规格进行安装。
以下 Python 脚本将生成视频的缩略图并将其保存到我们的本地目录 -
import subprocess
video_MP4_file=“C:\Users\gaurav\desktop\solar.mp4
thumbnail_image_file='thumbnail_solar_video.jpg'
subprocess.call(['ffmpeg', '-i', video_MP4_file, '-ss', '00:00:20.000', '-
vframes', '1', thumbnail_image_file, "-y"])
运行上述脚本后,我们会得到一个名为thumbnail_solar_video.jpg 的缩略图,并将其保存在本地目录中。
MP4 转 MP3
假设你已经从网站下载了一些视频文件,但是只需要文件中的音频就可以使用,可以使用Python库中的moviepy这个Python库来完成这个操作,可以在帮助下安装以下命令的 -
pip install moviepy
现在,在以下脚本的帮助下成功安装moviepy后,我们可以将MP4转换为MP3。
import moviepy.editor as mp
clip=mp.VideoFileClip(r"C:\Users\gaurav\Desktop\1234.mp4")
clip.audio.write_audiofile("movie_audio.mp3")
您可以观察输出,如下所示 -
<p>[MoviePy] Writing audio in movie_audio.mp3
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 674/674 [00:01
python抓取动态网页(python技术之api接口_开发者中心==抓取动态网页)
网站优化 • 优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2021-12-08 01:04
python抓取动态网页可以使用,该网站已经封堵该地址。
找到了一个安卓版app:httpwatcher/
同意上面。试了微信、新浪微博、豆瓣。没用。上面的网站不封闭,但是没反爬。普通app拿过来用用,可以。api的话只能拿一些分享图片和分享内容什么的。
apiview可以抓取微博所有分享。
没用过,不过可以走路件攻破,提供相关方法。
试一下这个:api接口_开发者中心===我曾经给微博后台添加过个安卓的单站api,貌似已经顺利拿下。
应该没有对应的封堵列表,
这个问题其实很容易解决,比如这个:微博抓取程序(动态htmltextpage)将站内抓取数据汇总后可以保存到本地吗?1.记录每条博文的id2.记录每条博文的发布时间3.将每条博文复制粘贴到记事本/word等能打开的地方。
建议关注公众号:android爬虫技术之api分享,
先注册一个公众号,然后安装客户端,微信公众号里面有api,也可以用, 查看全部
python抓取动态网页(python技术之api接口_开发者中心==抓取动态网页)
python抓取动态网页可以使用,该网站已经封堵该地址。
找到了一个安卓版app:httpwatcher/
同意上面。试了微信、新浪微博、豆瓣。没用。上面的网站不封闭,但是没反爬。普通app拿过来用用,可以。api的话只能拿一些分享图片和分享内容什么的。
apiview可以抓取微博所有分享。
没用过,不过可以走路件攻破,提供相关方法。
试一下这个:api接口_开发者中心===我曾经给微博后台添加过个安卓的单站api,貌似已经顺利拿下。
应该没有对应的封堵列表,
这个问题其实很容易解决,比如这个:微博抓取程序(动态htmltextpage)将站内抓取数据汇总后可以保存到本地吗?1.记录每条博文的id2.记录每条博文的发布时间3.将每条博文复制粘贴到记事本/word等能打开的地方。
建议关注公众号:android爬虫技术之api分享,
先注册一个公众号,然后安装客户端,微信公众号里面有api,也可以用,
python抓取动态网页(python网页爬虫怎么去爬数据(一)_抓取动态网页)
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-06 13:06
python抓取动态网页,特别是新闻报道动态内容。1.使用python写一个爬虫程序。2.抓取下来的数据,存放到数据库。3.使用其他爬虫程序,抓取数据库内的数据,发布到我们的网站。4.最后将新闻报道中的名字和标题编号等信息提取出来做数据可视化展示。5.每天读取新闻报道中的内容。并做简单的数据分析。
之前的回答确实可能不太清楚python网页爬虫具体怎么去爬数据,今天细细梳理一下这个问题的整个流程,方便其他相关专业的同学能够熟练使用这些工具。首先,要判断谁出的数据谁来抓:因为互联网中的网页数以万计,千千万万的页面,每个页面的内容可能都不同,所以,我们可以按照以下流程去分析:1.找到你爬取网页的网站header:ip=max(3000,10000)ips={}ip由于无法判断,所以最好是根据自己的ip进行判断,具体查看博客园的抓取过程及代码我的理解是:3000访问一个网站,500访问一个网站,可能会两个网站都建议抓,总之如果网站超过6000+,需要不断同步抓取。
那么用ip访问就有问题,因为你可能从ip不断发出的请求,目前规定是不能超过10000端口,否则adsl可能会过于繁忙,导致无法抓取。下面的抓取到页面内容部分讲解了ip的问题。以及,一定要提前分析你的网站,一个页面有多个header信息。注意:注意:注意:你的目标是web相关网站,所以想正则应该是要做正则匹配(如果不做正则匹配,curl命令在找页面时会无法被识别,只能从index_inurl的第一个字符开始搜),以及(搜索结果会由于ip过多,一些指定ip无法正确检索页面,可能会使用段代码)。
2.所有想要抓取的新闻页面的header参数有了,就可以进行爬取了(爬取前先看看你想抓取的页面:):请求速度,可以按抓取新闻页面前5个域名网址的速度进行筛选:page数/search_type数/page是不是4000/5000/10000!!!差5毫秒的就返回4050/2040/13000,差2毫秒的返回3050/2590/26000,好奇怪为什么,就为了截图么?为了避免重复遍历,请先看看新闻页面的结构。
解决方案:知乎回答一般是ajax加载页面,因此页面采用getpost,而后端可以采用post,可以传参数,也可以不传。爬虫抓取代码如下:processing.content.stop()//不会停止输出processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.strip()//开始弹出全屏画面processing。 查看全部
python抓取动态网页(python网页爬虫怎么去爬数据(一)_抓取动态网页)
python抓取动态网页,特别是新闻报道动态内容。1.使用python写一个爬虫程序。2.抓取下来的数据,存放到数据库。3.使用其他爬虫程序,抓取数据库内的数据,发布到我们的网站。4.最后将新闻报道中的名字和标题编号等信息提取出来做数据可视化展示。5.每天读取新闻报道中的内容。并做简单的数据分析。
之前的回答确实可能不太清楚python网页爬虫具体怎么去爬数据,今天细细梳理一下这个问题的整个流程,方便其他相关专业的同学能够熟练使用这些工具。首先,要判断谁出的数据谁来抓:因为互联网中的网页数以万计,千千万万的页面,每个页面的内容可能都不同,所以,我们可以按照以下流程去分析:1.找到你爬取网页的网站header:ip=max(3000,10000)ips={}ip由于无法判断,所以最好是根据自己的ip进行判断,具体查看博客园的抓取过程及代码我的理解是:3000访问一个网站,500访问一个网站,可能会两个网站都建议抓,总之如果网站超过6000+,需要不断同步抓取。
那么用ip访问就有问题,因为你可能从ip不断发出的请求,目前规定是不能超过10000端口,否则adsl可能会过于繁忙,导致无法抓取。下面的抓取到页面内容部分讲解了ip的问题。以及,一定要提前分析你的网站,一个页面有多个header信息。注意:注意:注意:你的目标是web相关网站,所以想正则应该是要做正则匹配(如果不做正则匹配,curl命令在找页面时会无法被识别,只能从index_inurl的第一个字符开始搜),以及(搜索结果会由于ip过多,一些指定ip无法正确检索页面,可能会使用段代码)。
2.所有想要抓取的新闻页面的header参数有了,就可以进行爬取了(爬取前先看看你想抓取的页面:):请求速度,可以按抓取新闻页面前5个域名网址的速度进行筛选:page数/search_type数/page是不是4000/5000/10000!!!差5毫秒的就返回4050/2040/13000,差2毫秒的返回3050/2590/26000,好奇怪为什么,就为了截图么?为了避免重复遍历,请先看看新闻页面的结构。
解决方案:知乎回答一般是ajax加载页面,因此页面采用getpost,而后端可以采用post,可以传参数,也可以不传。爬虫抓取代码如下:processing.content.stop()//不会停止输出processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.strip()//开始弹出全屏画面processing。
python抓取动态网页(如何车托之家评论?如何学习python基础语法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-12-05 16:16
python抓取动态网页:1.学习python基础语法2.web爬虫,这里用的是django3.实战,爬取汽车之家汽车评论4.网络爬虫5.数据可视化初步,
如果要写爬虫应该先学会http协议基础的不懂你的流程下载就是按网站协议去请求开始这边代码python第三方包:python如何抓取车托之家评论?一,第三方包下载,xpath,json,xpath(urllib2,requests,beautifulsoup,fs等)这些地方可以上网找相关资料,首先必须掌握了这些知识。
二,然后就是python里各种第三方包。这个可以单独下这个库,在time里面是抓包获取http方面的包,可以多练练,掌握下效率。然后就是模块了,这个推荐大家查清楚,在lxml,beautifulsoup里面定一个模块来做页面请求(不好代码,基本上就是构造请求,headers参数,返回html结构以及json格式)第三方库,这个就多了,xpath,scrapy就是按照标准库来抓取内容就行。
这个作为爬虫基础,有json这块的(xpath,json,selenium,pandas等,简单介绍下json)就好。需要搞懂xpath和python的第三方包,基本上爬取就已经没问题了。三,数据获取,通过有道等其他的搜索引擎可以下载到数据。总之就是一个爬虫入门的问题,这里就不再多说。顺便补充下爬虫方面的知识,可以参考下:大量数据抓取,大数据与人工智能爬虫方面的知识学习网。 查看全部
python抓取动态网页(如何车托之家评论?如何学习python基础语法)
python抓取动态网页:1.学习python基础语法2.web爬虫,这里用的是django3.实战,爬取汽车之家汽车评论4.网络爬虫5.数据可视化初步,
如果要写爬虫应该先学会http协议基础的不懂你的流程下载就是按网站协议去请求开始这边代码python第三方包:python如何抓取车托之家评论?一,第三方包下载,xpath,json,xpath(urllib2,requests,beautifulsoup,fs等)这些地方可以上网找相关资料,首先必须掌握了这些知识。
二,然后就是python里各种第三方包。这个可以单独下这个库,在time里面是抓包获取http方面的包,可以多练练,掌握下效率。然后就是模块了,这个推荐大家查清楚,在lxml,beautifulsoup里面定一个模块来做页面请求(不好代码,基本上就是构造请求,headers参数,返回html结构以及json格式)第三方库,这个就多了,xpath,scrapy就是按照标准库来抓取内容就行。
这个作为爬虫基础,有json这块的(xpath,json,selenium,pandas等,简单介绍下json)就好。需要搞懂xpath和python的第三方包,基本上爬取就已经没问题了。三,数据获取,通过有道等其他的搜索引擎可以下载到数据。总之就是一个爬虫入门的问题,这里就不再多说。顺便补充下爬虫方面的知识,可以参考下:大量数据抓取,大数据与人工智能爬虫方面的知识学习网。
python抓取动态网页(爬取js动态生成的页面是获取不到内容的源代码 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2021-12-05 06:17
)
抓取js动态生成的页面时,直接打开页面无法获取内容。比如我在抓取百度手机助手应用的时候就遇到了这样的问题。搜索旅游应用的时候,返回的数据有好几页内容,但是无论翻到哪一页,查看源码都可以找到,也就是第一页的源码。分析原因,我认为可能是这样的:假设百度应用的一个页面上有八个应用。你提交查询之后,他从内容的前八页生成一个html,然后你翻页的时候,替换成js,ajax等,原来的8个应用,比如你选择第五页的时候,用返回到应用程序列表的 33-40 个应用程序替换原来的 1-8 个应用程序。(应该是ajax或者其他更可能的表单提交方式,因为纯js不涉及表单提交等后端交互,第一次查询时所有结果都需要返回并存储在前端)【个人分析,请指正】
文章 想法参考来自:感谢原作者
好了,既然我们的目标已经明确了,那就找到对应的表达式提交(或js)动作。这里我们使用谷歌的开发者工具。我们接下来的操作是在谷歌浏览器中进行的。
让我们从头开始:
1、打开手机助手搜索“旅行”,网址:travel
我们得到了一个搜索结果:搜索到你:461旅游申请结果
这时候就可以查看源文件了。
2、 翻页url:旅游#page2发现源文件还是一样,这是动态加载造成的,那后面的界面怎么把握呢?
3、打开谷歌开发者工具:
此时没有内容,需要加载一次页面:url:%E6%97%85%E6%B8%B8#page2
在保留开发者工具如上图的前提下,在地址栏中输入你要解析的页面的URL(如上面的URL),然后就可以看到内容了:
里面的东西很多,我们需要一一看,但是你会发现,真正有价值的东西并不多。我们终于找到了这个:
这里的app名称就是我们想要爬取到第二页的app名称,这也是我们最终想要的。
4、 右击左边红框,可以复制链接:%E6%97%85%E6%B8%B8&page=1&_=09
打开这个链接后,我们发现这个网页的源码就是我们想要的(其实就是表单提交)。不是很好吗?
5、 但这还不够。我们想要的是一个通用的方法。提交此表单后如何构造数字?直接删除就行了,就是%E6%97%85%打开E6%B8%B8&page=1后,效果是一样的。如果一些网站有影响,你可以找到更多的模式。
6、 根据我们目前的信息,总结规则:
页码
#关于页码,需要说明一下,如果是第n页,填写页码n-1,第一页为0
7、 可能出现乱码,需要修改chrome编码为utf8
这个爬虫的python源代码:
#encoding:utf8
# @Author lvpengbin
'''
爬取百度手机助手app_name示例代码,以爬取搜索关键字“旅游”返回结果的第二页为例 url:http://shouji.baidu.com/s?wd=旅游#page2
'''
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import urllib2
from bs4 import BeautifulSoup
url='http://shouji.baidu.com/s%3Fda ... 39%3B
req_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',
'Accept':'*/*',
'Accept-Language':'zh-CN,zh;q=0.8',
'Connection':'close',
'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host
}#这里需要设置header,要不然系统默认的Accept-Language是英语,返回的页面是英文的
req_timeout = 5
req = urllib2.Request(url,None,req_header)
resp = urllib2.urlopen(req,None,req_timeout)
html = resp.read()
soup = BeautifulSoup(html)
nodes = soup.find_all("a",onclick="bd_app_dl(this,event);")
for node in nodes:
print node['data_name']
'''
输出:
优步 - Uber
蚂蜂窝自由行
飞常准
TripAdvisor
和生活
易到用车
爱城市
智行火车票-12306购票
TripAdvisor
淘在路上旅游
''' 查看全部
python抓取动态网页(爬取js动态生成的页面是获取不到内容的源代码
)
抓取js动态生成的页面时,直接打开页面无法获取内容。比如我在抓取百度手机助手应用的时候就遇到了这样的问题。搜索旅游应用的时候,返回的数据有好几页内容,但是无论翻到哪一页,查看源码都可以找到,也就是第一页的源码。分析原因,我认为可能是这样的:假设百度应用的一个页面上有八个应用。你提交查询之后,他从内容的前八页生成一个html,然后你翻页的时候,替换成js,ajax等,原来的8个应用,比如你选择第五页的时候,用返回到应用程序列表的 33-40 个应用程序替换原来的 1-8 个应用程序。(应该是ajax或者其他更可能的表单提交方式,因为纯js不涉及表单提交等后端交互,第一次查询时所有结果都需要返回并存储在前端)【个人分析,请指正】
文章 想法参考来自:感谢原作者
好了,既然我们的目标已经明确了,那就找到对应的表达式提交(或js)动作。这里我们使用谷歌的开发者工具。我们接下来的操作是在谷歌浏览器中进行的。
让我们从头开始:
1、打开手机助手搜索“旅行”,网址:travel
我们得到了一个搜索结果:搜索到你:461旅游申请结果
这时候就可以查看源文件了。
2、 翻页url:旅游#page2发现源文件还是一样,这是动态加载造成的,那后面的界面怎么把握呢?
3、打开谷歌开发者工具:
此时没有内容,需要加载一次页面:url:%E6%97%85%E6%B8%B8#page2
在保留开发者工具如上图的前提下,在地址栏中输入你要解析的页面的URL(如上面的URL),然后就可以看到内容了:
里面的东西很多,我们需要一一看,但是你会发现,真正有价值的东西并不多。我们终于找到了这个:
这里的app名称就是我们想要爬取到第二页的app名称,这也是我们最终想要的。
4、 右击左边红框,可以复制链接:%E6%97%85%E6%B8%B8&page=1&_=09
打开这个链接后,我们发现这个网页的源码就是我们想要的(其实就是表单提交)。不是很好吗?
5、 但这还不够。我们想要的是一个通用的方法。提交此表单后如何构造数字?直接删除就行了,就是%E6%97%85%打开E6%B8%B8&page=1后,效果是一样的。如果一些网站有影响,你可以找到更多的模式。
6、 根据我们目前的信息,总结规则:
页码
#关于页码,需要说明一下,如果是第n页,填写页码n-1,第一页为0
7、 可能出现乱码,需要修改chrome编码为utf8
这个爬虫的python源代码:
#encoding:utf8
# @Author lvpengbin
'''
爬取百度手机助手app_name示例代码,以爬取搜索关键字“旅游”返回结果的第二页为例 url:http://shouji.baidu.com/s?wd=旅游#page2
'''
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import urllib2
from bs4 import BeautifulSoup
url='http://shouji.baidu.com/s%3Fda ... 39%3B
req_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',
'Accept':'*/*',
'Accept-Language':'zh-CN,zh;q=0.8',
'Connection':'close',
'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host
}#这里需要设置header,要不然系统默认的Accept-Language是英语,返回的页面是英文的
req_timeout = 5
req = urllib2.Request(url,None,req_header)
resp = urllib2.urlopen(req,None,req_timeout)
html = resp.read()
soup = BeautifulSoup(html)
nodes = soup.find_all("a",onclick="bd_app_dl(this,event);")
for node in nodes:
print node['data_name']
'''
输出:
优步 - Uber
蚂蜂窝自由行
飞常准
TripAdvisor
和生活
易到用车
爱城市
智行火车票-12306购票
TripAdvisor
淘在路上旅游
'''
python抓取动态网页(需安装的三方库示例代码示例说明:获取德邦官网)
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-12-04 18:24
前言
在抓取一个普通的静态网页时,我们可以直接请求相应的URL来获取完整的HTML页面,但是对于动态页面来说,网页显示的内容往往是通过ajax动态生成的,所以如果直接使用urllib.request的时候获取页面的HTML,就无法获取到我们想要的内容。然后我们就可以使用selenium库来获取我们需要的内容了。
需要安装的三方库示例代码
示例说明:获取德邦官网开设网点所在的城市区域名称
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless") #设置该参数使在获取网页时不打开浏览器
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path="./chromedriver")
driver.get("https://www.deppon.com/deptlist/")
html = driver.page_source
driver.close()
soup = BeautifulSoup(html, 'lxml')
items = soup.select('div[class~="listA_Z"] a')
for item in items:
print(item.string)
遇到的小问题用“pip install selenium”安装selenium库失败。您可以使用以下命令安装“pip install --trusted-host --trusted-host selenium”。使用webdriver.Chrome()时,出现问题。我在网上看到的文章用的是火狐浏览器。他们可以直接使用 webdriver.Firefox(),但我使用 Google Chrome。我以为使用谷歌浏览器和使用火狐是一样的,但是在运行时发生了错误。后来我在网上找到了。我想从 selenium 官网下载 Chrom Driver。然后,当使用 webdriver.chorme() 函数时,我需要上传它。executable_path参数,该参数的值为selenium官网下载的Chrome Driver.exe文件所在的路径。在示例中,我把chromedriver.exe放在根目录下,所以在代码中使用了相对路径(executable_path="./chromedriver")。推荐
Chrom/firefox浏览器插件:Katalon Recorder,Katalon Recorder是一个前端自动化测试插件,可以用来记录你在网页上的所有操作,最神奇的是它还可以导出记录到各种代码,其中收录 Python2 代码。有时候借用它,我们甚至可以不用分析HTML的结构就可以很容易的得到我们需要的数据,这对于HTML结构凌乱的网页非常有帮助。 查看全部
python抓取动态网页(需安装的三方库示例代码示例说明:获取德邦官网)
前言
在抓取一个普通的静态网页时,我们可以直接请求相应的URL来获取完整的HTML页面,但是对于动态页面来说,网页显示的内容往往是通过ajax动态生成的,所以如果直接使用urllib.request的时候获取页面的HTML,就无法获取到我们想要的内容。然后我们就可以使用selenium库来获取我们需要的内容了。
需要安装的三方库示例代码
示例说明:获取德邦官网开设网点所在的城市区域名称
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless") #设置该参数使在获取网页时不打开浏览器
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path="./chromedriver")
driver.get("https://www.deppon.com/deptlist/")
html = driver.page_source
driver.close()
soup = BeautifulSoup(html, 'lxml')
items = soup.select('div[class~="listA_Z"] a')
for item in items:
print(item.string)
遇到的小问题用“pip install selenium”安装selenium库失败。您可以使用以下命令安装“pip install --trusted-host --trusted-host selenium”。使用webdriver.Chrome()时,出现问题。我在网上看到的文章用的是火狐浏览器。他们可以直接使用 webdriver.Firefox(),但我使用 Google Chrome。我以为使用谷歌浏览器和使用火狐是一样的,但是在运行时发生了错误。后来我在网上找到了。我想从 selenium 官网下载 Chrom Driver。然后,当使用 webdriver.chorme() 函数时,我需要上传它。executable_path参数,该参数的值为selenium官网下载的Chrome Driver.exe文件所在的路径。在示例中,我把chromedriver.exe放在根目录下,所以在代码中使用了相对路径(executable_path="./chromedriver")。推荐
Chrom/firefox浏览器插件:Katalon Recorder,Katalon Recorder是一个前端自动化测试插件,可以用来记录你在网页上的所有操作,最神奇的是它还可以导出记录到各种代码,其中收录 Python2 代码。有时候借用它,我们甚至可以不用分析HTML的结构就可以很容易的得到我们需要的数据,这对于HTML结构凌乱的网页非常有帮助。
python抓取动态网页( 如何利用Python爬取模块获取查看器的html内容(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2021-12-04 18:19
如何利用Python爬取模块获取查看器的html内容(图))
1. 文章 目的
我们在使用Python抓取网页数据时,经常会用到urllib模块,通过调用urllib模块的urlopen(url)方法返回网页。
页面对象,使用read()方法获取url的html内容,然后使用BeautifulSoup抓取某个标签的内容,结合正则表
亲爱的过滤器。然而,你用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容,还有很多动态数据(比如 网站
访问量、当前在线人数、微博点赞数等)不收录在静态html中,比如我要抢这个bbs网
当前点击打开网站各版块链接的在线人数不收录在静态html网页中(如果不信,请尝试查看页面的源代码,
只有一条简单的线)。这些动态数据大部分是由JavaScript、JQuery、PHP等语言动态生成的,因此,
不宜使用爬取静态html内容的方法。
2. 解决方案
我试过网上提到的浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具),上网查了一下
动态数据的趋势是可以得到的,但是这需要从众多的URL中寻找线索,我个人觉得太麻烦了。另外,使用查看器
查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何查看
html变成python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
并且无意中找到了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,并找到当前se
ssion 对应的标签。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一个
一些重要的动态数据。其实selenium模块的功能不限于抓取网页,它是网络自动化测试的常用模块
,在Ruby和Java中被广泛使用。Python虽然使用的比较少,但它也是一个非常简洁、高效、易用的工具。
手的自动化测试模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,还可以
可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
3. 实施过程
3.1 运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有self
用selenium,如果直接在Python程序中导入selenium,会提示没有这个模块。联网状态下,cmd直接进入pip i
安装selenium,系统会找到Python安装目录直接下载、解压安装这个模块。等到终端提示完成
看看C:\Python27\Lib\site-packages目录下有没有selenium模块,这个目录取决于你安装的Python
的路径。如果有两个文件夹,selenium和selenium-2.47.3.dist-info,可以在Python程序中添加模块
已加载。
使用 webdriver 捕获动态数据
先导入webdriver子模块
从硒导入网络驱动程序
获取浏览器会话,可以使用火狐、Chrome、IE等浏览器,这里以火狐为例
浏览器 = webdriver.Firefox()
加载页面,只需在url中指定一个有效的字符串
browser.get(url)
获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
姓名
班级名称
关联
文本
部分的
关联
文本
标签
姓名
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考selenium webdriver(python)教程第三章-定位方法(第一版可百度
学位图书馆阅读)
结合正则表达式过滤相关信息
定位后的一些元素是不可取的,使用常规过滤即可。比如我想只提取英文字符(包括0-9),创建如下
常规的
pa=堆(r'\w+')
对于 lis 中的你:
en=pa.findall(u.lis)
印刷英文
关闭会话
执行fetch操作后必须关闭session,否则让它一直占用内存会影响机器上其他进程的操作
Browser.close() 或 browser.quit() 可以关闭会话,前者只是关闭当前会话,浏览器的webdrive
r 没有关闭,后者是关闭包括webdriver在内的所有东西
添加异常处理
这是必须的,因为有时候会获取session失败,所以把上面的语句块放到try里面,然后用exception处理
除了 NoSuchElementException:
断言 0,“找不到元素”
4. 代码实现
我通过点击打开链接抓取了指定分区中每个分区的在线用户数,并指定分区id号(0-9),可以得到分区名和对
在线用户数应该打印在一个列表中,代码如下
[python] 查看平原
# -*- 编码:utf-8 -*-
从硒导入网络驱动程序
从 mon.exceptions 导入 NoSuchElementException
导入时间
进口重新
def find_sec(secid):
pa=堆(r'\w+')
browser = webdriver.Firefox() # 获取firefox的本地会话
browser.get("!section/%s "%secid) # 加载页面
time.sleep(1) # 让页面加载
结果=[]
尝试:
#获取页面名称和在线号码组成列表
board=browser.find_elements_by_class_name('title_1')
ol_num=browser.find_elements_by_class_name('title_4')
max_bindex=len(板)
max_oindex=len(ol_num)
assert max_bindex==max_oindex,'索引不等价!'
#页面名称为中英文,所以常规过滤后只剩下英文
对于范围内的 i (1,max_oindex):
board_en=pa.findall(board.text)
result.append([str(board_en[-1]),int(ol_num.text)])
浏览器关闭()
返回结果
除了 NoSuchElementException:
断言 0,“找不到元素”
print find_sec('5')#打印第5分区下所有版块的当前在线用户列表
运行结果如下:
终端打印效果
4. 总结
Selenium 在代码简洁性和执行效率方面非常出色。使用 selenium webdriver 捕获动态数据不是
它通常简单而有效。也可以进一步利用这个来实现数据挖掘、机器学习等深度研究,所以selenium+pyth
就值得深入研究!如果觉得每次都用selenium打开浏览器不方便,可以用phantomjs模拟一个虚拟的
浏览器出来了,这里就不赘述了。 查看全部
python抓取动态网页(
如何利用Python爬取模块获取查看器的html内容(图))

1. 文章 目的
我们在使用Python抓取网页数据时,经常会用到urllib模块,通过调用urllib模块的urlopen(url)方法返回网页。
页面对象,使用read()方法获取url的html内容,然后使用BeautifulSoup抓取某个标签的内容,结合正则表
亲爱的过滤器。然而,你用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容,还有很多动态数据(比如 网站
访问量、当前在线人数、微博点赞数等)不收录在静态html中,比如我要抢这个bbs网
当前点击打开网站各版块链接的在线人数不收录在静态html网页中(如果不信,请尝试查看页面的源代码,
只有一条简单的线)。这些动态数据大部分是由JavaScript、JQuery、PHP等语言动态生成的,因此,
不宜使用爬取静态html内容的方法。
2. 解决方案
我试过网上提到的浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具),上网查了一下
动态数据的趋势是可以得到的,但是这需要从众多的URL中寻找线索,我个人觉得太麻烦了。另外,使用查看器
查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何查看
html变成python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
并且无意中找到了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,并找到当前se
ssion 对应的标签。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一个
一些重要的动态数据。其实selenium模块的功能不限于抓取网页,它是网络自动化测试的常用模块
,在Ruby和Java中被广泛使用。Python虽然使用的比较少,但它也是一个非常简洁、高效、易用的工具。
手的自动化测试模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,还可以
可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
3. 实施过程
3.1 运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有self
用selenium,如果直接在Python程序中导入selenium,会提示没有这个模块。联网状态下,cmd直接进入pip i
安装selenium,系统会找到Python安装目录直接下载、解压安装这个模块。等到终端提示完成
看看C:\Python27\Lib\site-packages目录下有没有selenium模块,这个目录取决于你安装的Python
的路径。如果有两个文件夹,selenium和selenium-2.47.3.dist-info,可以在Python程序中添加模块
已加载。
使用 webdriver 捕获动态数据
先导入webdriver子模块
从硒导入网络驱动程序
获取浏览器会话,可以使用火狐、Chrome、IE等浏览器,这里以火狐为例
浏览器 = webdriver.Firefox()
加载页面,只需在url中指定一个有效的字符串
browser.get(url)
获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
姓名
班级名称
关联
文本
部分的
关联
文本
标签
姓名
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考selenium webdriver(python)教程第三章-定位方法(第一版可百度
学位图书馆阅读)
结合正则表达式过滤相关信息
定位后的一些元素是不可取的,使用常规过滤即可。比如我想只提取英文字符(包括0-9),创建如下
常规的
pa=堆(r'\w+')
对于 lis 中的你:
en=pa.findall(u.lis)
印刷英文
关闭会话
执行fetch操作后必须关闭session,否则让它一直占用内存会影响机器上其他进程的操作
Browser.close() 或 browser.quit() 可以关闭会话,前者只是关闭当前会话,浏览器的webdrive
r 没有关闭,后者是关闭包括webdriver在内的所有东西
添加异常处理
这是必须的,因为有时候会获取session失败,所以把上面的语句块放到try里面,然后用exception处理
除了 NoSuchElementException:
断言 0,“找不到元素”
4. 代码实现
我通过点击打开链接抓取了指定分区中每个分区的在线用户数,并指定分区id号(0-9),可以得到分区名和对
在线用户数应该打印在一个列表中,代码如下
[python] 查看平原
# -*- 编码:utf-8 -*-
从硒导入网络驱动程序
从 mon.exceptions 导入 NoSuchElementException
导入时间
进口重新
def find_sec(secid):
pa=堆(r'\w+')
browser = webdriver.Firefox() # 获取firefox的本地会话
browser.get("!section/%s "%secid) # 加载页面
time.sleep(1) # 让页面加载
结果=[]
尝试:
#获取页面名称和在线号码组成列表
board=browser.find_elements_by_class_name('title_1')
ol_num=browser.find_elements_by_class_name('title_4')
max_bindex=len(板)
max_oindex=len(ol_num)
assert max_bindex==max_oindex,'索引不等价!'
#页面名称为中英文,所以常规过滤后只剩下英文
对于范围内的 i (1,max_oindex):
board_en=pa.findall(board.text)
result.append([str(board_en[-1]),int(ol_num.text)])
浏览器关闭()
返回结果
除了 NoSuchElementException:
断言 0,“找不到元素”
print find_sec('5')#打印第5分区下所有版块的当前在线用户列表
运行结果如下:
终端打印效果
4. 总结
Selenium 在代码简洁性和执行效率方面非常出色。使用 selenium webdriver 捕获动态数据不是
它通常简单而有效。也可以进一步利用这个来实现数据挖掘、机器学习等深度研究,所以selenium+pyth
就值得深入研究!如果觉得每次都用selenium打开浏览器不方便,可以用phantomjs模拟一个虚拟的
浏览器出来了,这里就不赘述了。
python抓取动态网页(excel中3.算法的性能,需要找到需求的文件进行排除)
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-03 18:32
需求场景:需要找到收录源代码中指定的客户信息的某些字段。
版本 1:检索关键字,如果收录,则将其输出到控制台。
import os
rootDir = os.getcwd()
def scan_file(filename, dirname):
if("hello" in filename):
if("src" in dirname):
print(os.path.join(dirname,filename))
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
#print(l)
if("hello" in l):
if("/src" in dirname):
print(os.path.join(dirname,filename))
break
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
scan_file(fname, dirName)
版本2:检索多个关键字,输出收录关键字和收录的关键字的文件
rootDir = os.getcwd()
keywords = ["hello","world","thanks"]
def scan_file(filename, dirname,keyword):
if(keyword in filename):
if("/src" in dirname):
return True
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
if(keyword in l):
if("/src" in dirname):
return True
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
flag = False
for keyword in keywords:
if(scan_file(fname, dirName,keyword)):
if(flag is False):
flag = True
f = open('test.txt', 'a')
f.write(keyword)
f.write(" ,")
f.close()
if(flag is True):
f = open('test.txt', 'a')
f.write("\n"+os.path.join(dirName,fname)+"\n")
f.close()
这个版本实现了基本功能,但还不够完善。迭代空间:
1.算法的性能,包括代码的时间复杂度、冗余度和优雅度
2.输出结果的可读性,最好按照模块组织文件,并在excel中呈现
3.详情:排除不符合要求的文件,如png。
留给读者思考。 查看全部
python抓取动态网页(excel中3.算法的性能,需要找到需求的文件进行排除)
需求场景:需要找到收录源代码中指定的客户信息的某些字段。
版本 1:检索关键字,如果收录,则将其输出到控制台。
import os
rootDir = os.getcwd()
def scan_file(filename, dirname):
if("hello" in filename):
if("src" in dirname):
print(os.path.join(dirname,filename))
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
#print(l)
if("hello" in l):
if("/src" in dirname):
print(os.path.join(dirname,filename))
break
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
scan_file(fname, dirName)
版本2:检索多个关键字,输出收录关键字和收录的关键字的文件
rootDir = os.getcwd()
keywords = ["hello","world","thanks"]
def scan_file(filename, dirname,keyword):
if(keyword in filename):
if("/src" in dirname):
return True
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
if(keyword in l):
if("/src" in dirname):
return True
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
flag = False
for keyword in keywords:
if(scan_file(fname, dirName,keyword)):
if(flag is False):
flag = True
f = open('test.txt', 'a')
f.write(keyword)
f.write(" ,")
f.close()
if(flag is True):
f = open('test.txt', 'a')
f.write("\n"+os.path.join(dirName,fname)+"\n")
f.close()
这个版本实现了基本功能,但还不够完善。迭代空间:
1.算法的性能,包括代码的时间复杂度、冗余度和优雅度
2.输出结果的可读性,最好按照模块组织文件,并在excel中呈现
3.详情:排除不符合要求的文件,如png。
留给读者思考。
python抓取动态网页(web页面使用ajax技术动态加载页面的解决办法内存开销 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2021-12-03 15:00
)
现在很多网页都使用ajax技术来动态加载页面。但是对于爬虫来说,目标数据可能不在页面的HTML源代码中(右键查看网页源代码,F12搜索),静态页面的爬虫已经不能满足当前的需求.
很多教程推荐结合使用Selenium和PhantomJS来渲染网页,获取网页的所有信息。但是对于爬虫程序来说,模拟浏览器的内存开销很大,效率很低。
好消息是,大部分浏览器在请求解析完 HTML 后,会根据 js 的“指令”发送另一个请求,获取页面显示的内容,然后通过 js 渲染后显示到界面上。这类请求的内容往往是json格式,这样既不会加重爬虫任务,反而可以省去解析HTML的工作量。
本文以抓取某位名人在Instagram上传的所有图片为例,讲解动态加载页面的解决方案。文末附上所有代码
工具:铬
包:json、请求、urllib
分析ins页面
一个用户的主页
打开一个用户ins的首页(),可以看到首页只加载了12张图片,点击“更多”会加载更多图片。我们先来获取这12张图片的网址。
获取前12张图片的URL
首先检查源代码中是否存在图片的URL。在脚本标签中找到了前 12 张图片的 URL。
网页源代码
有了这个发现,我们可以提取到首页的12个图片网址!!
代码显示如下:
通过使用lxml库实现解析,不懂lxml的小朋友可以去崔大神的博客学习。
获取更多图片的网址
当我单击“更多”按钮时,我发现 XHR 选项卡中加载了一些新文件。
加载前
加载后
每次页面下拉,加载12张图片,“?query_idbalabala”文件也会加1个!
单击文件可查看详细信息。发现文件返回的是json数据,数据中收录了我们想要的图片网址!!
返回的json数据
所以只要拿到这些json数据,就可以提取出更多的图片网址。
索取资料
索取资料
索取资料
仔细查看上图中的Request URL,让我们分析一下它的请求参数(包括query_id、id、first、after),可以看到后续加载的query_id为“059182”,“id”为你访问的用户的用户id,即“1161353543”,“first”是一次加载的图片数量,总是12,“after”比较复杂。但是按照常识,这个参数应该在之前的文件中可以找到。
找到“之后”
使用ctrl+F查找页面源码中after参数对应的值。脚本标签中也是一样,只是对应的键名是“end_cursor”
采集了四个请求参数,现在我们可以构造Request URL,通过解析返回的json数据获取更多的图片URL
代码显示如下:
src_list中保存了用户590张图片的URL,现在是时候进入下载链接了~
下载图片
博主懒得换代理,直接用最简单粗暴的方式下载图片。
结果显示~
所有代码
# -*- coding: utf-8 -*-
import json
import requests
from lxml import etree
from urllib import parse
BASE_URL = "https://www.instagram.com/urnotchrislee/"
headers = {
"Origin": "https://www.instagram.com/",
"Referer": "https://www.instagram.com/urnotchrislee/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",
"Host": "www.instagram.com"}
def load_rest(table,has_next_page):
rest = []
while has_next_page:
text = json.dumps(table)
URL = 'https://www.instagram.com/grap ... quote(text)
res = requests.get(URL,headers = headers)
dic = json.loads(res.content.decode(),encoding='utf-8')
data = dic['data']['user']['edge_owner_to_timeline_media']
nodes = data['edges']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
for node in nodes:
rest.append(node['node']['display_url'])
#print(node['node']['display_url'])
table['after'] = end_cursor
print('加载..')
print('加载完成')
return rest
if __name__=='__main__':
res = requests.get(BASE_URL,headers = headers)
html = etree.HTML(res.content.decode())
# h = html.xpath('''//script[@type="text/javascript"]/text()''')[1].replace('window._sharedData =','').strip()
h = html.xpath('''//script[@type="text/javascript"]''')[1].text.replace('window._sharedData = ','').strip()[:-1]
dic = json.loads(h,encoding='utf-8')
data = dic['entry_data']['ProfilePage'][0]['user']['media']
nodes = data['nodes']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
lee_id = nodes[0]["owner"]["id"] #'1161353543'
src_list = []
for node in nodes:
src_list.append(node['display_src'])
print(node['display_src'])
print('加载')
table = {
'id':lee_id,
'first':12,
'after':end_cursor}
rest = load_rest(table,has_next_page)
src_list = src_list + rest
print(len(src_list))
# with open('abc', 'w') as f:
# for s in src_list:
# f.write(s)
# f.write('\n')
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",}
for i in range(len(src_list)):
url = src_list[i].strip()
res = requests.get(url,headers = headers)
with open('第'+str(i+1)+'张.jpg','wb') as ff:
ff.write(res.content)
参考页面:
网络爬虫用Python-04.另一种爬虫方法
Python 的 Instagram 图片爬虫 (一)
Python 的 Instagram 图片爬虫 (二)
新手小白,逻辑混乱,欢迎大佬指正,请吐槽
查看全部
python抓取动态网页(web页面使用ajax技术动态加载页面的解决办法内存开销
)
现在很多网页都使用ajax技术来动态加载页面。但是对于爬虫来说,目标数据可能不在页面的HTML源代码中(右键查看网页源代码,F12搜索),静态页面的爬虫已经不能满足当前的需求.
很多教程推荐结合使用Selenium和PhantomJS来渲染网页,获取网页的所有信息。但是对于爬虫程序来说,模拟浏览器的内存开销很大,效率很低。
好消息是,大部分浏览器在请求解析完 HTML 后,会根据 js 的“指令”发送另一个请求,获取页面显示的内容,然后通过 js 渲染后显示到界面上。这类请求的内容往往是json格式,这样既不会加重爬虫任务,反而可以省去解析HTML的工作量。
本文以抓取某位名人在Instagram上传的所有图片为例,讲解动态加载页面的解决方案。文末附上所有代码

工具:铬
包:json、请求、urllib
分析ins页面

一个用户的主页
打开一个用户ins的首页(),可以看到首页只加载了12张图片,点击“更多”会加载更多图片。我们先来获取这12张图片的网址。
获取前12张图片的URL
首先检查源代码中是否存在图片的URL。在脚本标签中找到了前 12 张图片的 URL。

网页源代码
有了这个发现,我们可以提取到首页的12个图片网址!!
代码显示如下:


通过使用lxml库实现解析,不懂lxml的小朋友可以去崔大神的博客学习。
获取更多图片的网址
当我单击“更多”按钮时,我发现 XHR 选项卡中加载了一些新文件。

加载前

加载后
每次页面下拉,加载12张图片,“?query_idbalabala”文件也会加1个!

单击文件可查看详细信息。发现文件返回的是json数据,数据中收录了我们想要的图片网址!!

返回的json数据
所以只要拿到这些json数据,就可以提取出更多的图片网址。

索取资料

索取资料

索取资料
仔细查看上图中的Request URL,让我们分析一下它的请求参数(包括query_id、id、first、after),可以看到后续加载的query_id为“059182”,“id”为你访问的用户的用户id,即“1161353543”,“first”是一次加载的图片数量,总是12,“after”比较复杂。但是按照常识,这个参数应该在之前的文件中可以找到。
找到“之后”
使用ctrl+F查找页面源码中after参数对应的值。脚本标签中也是一样,只是对应的键名是“end_cursor”

采集了四个请求参数,现在我们可以构造Request URL,通过解析返回的json数据获取更多的图片URL

代码显示如下:

src_list中保存了用户590张图片的URL,现在是时候进入下载链接了~
下载图片
博主懒得换代理,直接用最简单粗暴的方式下载图片。

结果显示~

所有代码
# -*- coding: utf-8 -*-
import json
import requests
from lxml import etree
from urllib import parse
BASE_URL = "https://www.instagram.com/urnotchrislee/"
headers = {
"Origin": "https://www.instagram.com/",
"Referer": "https://www.instagram.com/urnotchrislee/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",
"Host": "www.instagram.com"}
def load_rest(table,has_next_page):
rest = []
while has_next_page:
text = json.dumps(table)
URL = 'https://www.instagram.com/grap ... quote(text)
res = requests.get(URL,headers = headers)
dic = json.loads(res.content.decode(),encoding='utf-8')
data = dic['data']['user']['edge_owner_to_timeline_media']
nodes = data['edges']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
for node in nodes:
rest.append(node['node']['display_url'])
#print(node['node']['display_url'])
table['after'] = end_cursor
print('加载..')
print('加载完成')
return rest
if __name__=='__main__':
res = requests.get(BASE_URL,headers = headers)
html = etree.HTML(res.content.decode())
# h = html.xpath('''//script[@type="text/javascript"]/text()''')[1].replace('window._sharedData =','').strip()
h = html.xpath('''//script[@type="text/javascript"]''')[1].text.replace('window._sharedData = ','').strip()[:-1]
dic = json.loads(h,encoding='utf-8')
data = dic['entry_data']['ProfilePage'][0]['user']['media']
nodes = data['nodes']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
lee_id = nodes[0]["owner"]["id"] #'1161353543'
src_list = []
for node in nodes:
src_list.append(node['display_src'])
print(node['display_src'])
print('加载')
table = {
'id':lee_id,
'first':12,
'after':end_cursor}
rest = load_rest(table,has_next_page)
src_list = src_list + rest
print(len(src_list))
# with open('abc', 'w') as f:
# for s in src_list:
# f.write(s)
# f.write('\n')
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",}
for i in range(len(src_list)):
url = src_list[i].strip()
res = requests.get(url,headers = headers)
with open('第'+str(i+1)+'张.jpg','wb') as ff:
ff.write(res.content)
参考页面:
网络爬虫用Python-04.另一种爬虫方法
Python 的 Instagram 图片爬虫 (一)
Python 的 Instagram 图片爬虫 (二)
新手小白,逻辑混乱,欢迎大佬指正,请吐槽

python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-12-03 11:01
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:
可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:
然后直接点一个进去,复制url(右键复制链接地址)看看是什么:
原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l 查看全部
python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:

可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:

然后直接点一个进去,复制url(右键复制链接地址)看看是什么:

原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l
python抓取动态网页(PythonPyQt4的思路和动态解析页面信息的解决思路!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-11-30 07:18
很久以前,在学习Python web编程的时候,涉及到一个Python urllib。您可以使用 urllib.urlopen("url").read() 轻松读取页面上的静态信息。但是,随着时代的发展,越来越多的网页使用jQuery、PHP等语言来动态生成页面信息。因此,使用urllib抓取页面的HTML还不足以达到预期的效果。
解决方案:
动态分析页面信息有一个最简单的想法。 Urllib 无法解析动态信息,但浏览器可以。浏览器上显示的处理信息实际上是经过处理的HTML文档。这为我们抓取动态页面信息提供了一个很好的思路。 Python-PyQt 中有一个著名的图形库。虽然 PyQt 是一个图形库,但它在 QtWebkit 内部。这是非常实用的。谷歌的Chrome和苹果的Safari都是基于WebKit核心开发的,所以我们可以通过PyQt中的QtWebKit将页面中的信息读取加载到HTML文档中,然后解析HTML文档,从我们要使用的HTML文档中提取出来信息。
所需材料:
作者本人使用的是 Mac OS X,Windows 和 Linux 平台应该使用相同的方法。
1、Qt4 库
库,而不是创建者。 Mac默认安装路径下的库应该是/home/username/Developor/,Qt4默认安装路径不要改动。否则安装可能会失败。
官网:
2、SIP、PyQt4
这两个软件可以在PyQt官网找到。源代码已下载。 Mac和Linux需要自己编译。
下载地址为:
在终端中,切换到解压文件所在的目录。
在终端输入
python configure.py
制作
sudo make install
安装和编译。
SIP 和 PyQt4 的安装方法是一样的。但是 PyQt4 依赖于 SIP。所以先安装SIP再安装PyQt4
1、2 两步完成后,安装Python PyQt4模块。在Python shell中输入import PyQt4,看看能不能找到PyQt4模块。
3、Spynner
spynner 是一个 QtWebKit 客户端,可以模拟浏览器完成加载页面、触发事件、填写表单等操作。
这个模块可以在 Python 的官方网站上找到。
下载地址:
解压后cd到安装目录,然后输入sudo python configure.py install安装模块。
这样Spynner模块的安装就完成了。在python shell中尝试import spynner,看看是否安装了模块。
Spynner 的简单使用
Spynner的功能很强大,但由于本人能力有限,下面介绍一下网页源代码的显示方式。
[python] 查看普通副本
#!/usr/bin/python#-*-coding:utf-8-*-importspynnerbrowser=spynner.Browser()#创建浏览器对象browser.hide()#打开浏览器并隐藏。 browser.load("")#browser类有一个类方法load,可以使用webkit来加载你要加载的页面信息。 #load(是你要加载的URL的字符串形式)printbrowser.html.encode("utf-8")#浏览器类的成员之一是html,就是页面后面的源码的字符串已处理#转码为UTF-8编码 open("Test.html",'w+').write(browser.html.encode("utf-8"))#也可以写成文件,浏览 设备打开。 browser.close()#关闭浏览器
通过这个程序,你可以很方便的显示webkit处理的页面的HTML源代码。
Spynner 应用程序
先介绍一下spynner的简单应用。通过一个简单的程序,你就可以得到你在浏览器中看到的页面的所有图片。可以使用 HTMLParser、BeautifulSoup 等来解析 HTMLParser 文档。我选择 HTMParser。
[python] 查看普通副本
#!/usr/bin/pythonimportspynnerimportHTMLParserimportosimporturllibclassMyParser(HTMLParser.HTMLParser):defhandle_starttag(self,tag,attrs):iftag=='img':url=dict(attrs)['src']name=os.path。 basename(dict(attrs)['src'])ifname.endswith('.jpg')orname.endswith('.png')orname.endswith('gif'):print"下载.....",nameurllib .urlretrieve(url,name)if__name__=="__main__":browser=spynner.Browser()browser.show()browser.load("")Parser=MyParser()Parser.feed(browser.html)print"Done" browser.close()
通过这个程序,您可以下载您在页面上看到的所有图片。几行简单的程序就可以完成这项艰巨的任务。实现图片的批量处理。这确实是Python语言的优势,所以就让繁重的任务交给第三方吧。 查看全部
python抓取动态网页(PythonPyQt4的思路和动态解析页面信息的解决思路!)
很久以前,在学习Python web编程的时候,涉及到一个Python urllib。您可以使用 urllib.urlopen("url").read() 轻松读取页面上的静态信息。但是,随着时代的发展,越来越多的网页使用jQuery、PHP等语言来动态生成页面信息。因此,使用urllib抓取页面的HTML还不足以达到预期的效果。
解决方案:
动态分析页面信息有一个最简单的想法。 Urllib 无法解析动态信息,但浏览器可以。浏览器上显示的处理信息实际上是经过处理的HTML文档。这为我们抓取动态页面信息提供了一个很好的思路。 Python-PyQt 中有一个著名的图形库。虽然 PyQt 是一个图形库,但它在 QtWebkit 内部。这是非常实用的。谷歌的Chrome和苹果的Safari都是基于WebKit核心开发的,所以我们可以通过PyQt中的QtWebKit将页面中的信息读取加载到HTML文档中,然后解析HTML文档,从我们要使用的HTML文档中提取出来信息。
所需材料:
作者本人使用的是 Mac OS X,Windows 和 Linux 平台应该使用相同的方法。
1、Qt4 库
库,而不是创建者。 Mac默认安装路径下的库应该是/home/username/Developor/,Qt4默认安装路径不要改动。否则安装可能会失败。
官网:
2、SIP、PyQt4
这两个软件可以在PyQt官网找到。源代码已下载。 Mac和Linux需要自己编译。
下载地址为:
在终端中,切换到解压文件所在的目录。
在终端输入
python configure.py
制作
sudo make install
安装和编译。
SIP 和 PyQt4 的安装方法是一样的。但是 PyQt4 依赖于 SIP。所以先安装SIP再安装PyQt4
1、2 两步完成后,安装Python PyQt4模块。在Python shell中输入import PyQt4,看看能不能找到PyQt4模块。
3、Spynner
spynner 是一个 QtWebKit 客户端,可以模拟浏览器完成加载页面、触发事件、填写表单等操作。
这个模块可以在 Python 的官方网站上找到。
下载地址:
解压后cd到安装目录,然后输入sudo python configure.py install安装模块。
这样Spynner模块的安装就完成了。在python shell中尝试import spynner,看看是否安装了模块。
Spynner 的简单使用
Spynner的功能很强大,但由于本人能力有限,下面介绍一下网页源代码的显示方式。
[python] 查看普通副本
#!/usr/bin/python#-*-coding:utf-8-*-importspynnerbrowser=spynner.Browser()#创建浏览器对象browser.hide()#打开浏览器并隐藏。 browser.load("")#browser类有一个类方法load,可以使用webkit来加载你要加载的页面信息。 #load(是你要加载的URL的字符串形式)printbrowser.html.encode("utf-8")#浏览器类的成员之一是html,就是页面后面的源码的字符串已处理#转码为UTF-8编码 open("Test.html",'w+').write(browser.html.encode("utf-8"))#也可以写成文件,浏览 设备打开。 browser.close()#关闭浏览器
通过这个程序,你可以很方便的显示webkit处理的页面的HTML源代码。
Spynner 应用程序
先介绍一下spynner的简单应用。通过一个简单的程序,你就可以得到你在浏览器中看到的页面的所有图片。可以使用 HTMLParser、BeautifulSoup 等来解析 HTMLParser 文档。我选择 HTMParser。
[python] 查看普通副本
#!/usr/bin/pythonimportspynnerimportHTMLParserimportosimporturllibclassMyParser(HTMLParser.HTMLParser):defhandle_starttag(self,tag,attrs):iftag=='img':url=dict(attrs)['src']name=os.path。 basename(dict(attrs)['src'])ifname.endswith('.jpg')orname.endswith('.png')orname.endswith('gif'):print"下载.....",nameurllib .urlretrieve(url,name)if__name__=="__main__":browser=spynner.Browser()browser.show()browser.load("")Parser=MyParser()Parser.feed(browser.html)print"Done" browser.close()
通过这个程序,您可以下载您在页面上看到的所有图片。几行简单的程序就可以完成这项艰巨的任务。实现图片的批量处理。这确实是Python语言的优势,所以就让繁重的任务交给第三方吧。
python抓取动态网页(千人基因组数据库中爬取CHB人群的等位基因频率信息解析)
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-11-30 07:16
该计划的目的:
根据特定的SNP列表,从千基因组数据库中爬取CHB群体的等位基因频率信息,例如。
因为网页是动态数据,内嵌了JavaScript代码,所以使用selenium来爬取信息。
Beautiful Soup 是一个python 库,主要功能是从网页中抓取数据。Beautiful Soup 提供了一些简单的、python 风格的函数来处理导航、搜索、修改分析树和其他功能。它是一个工具箱,为用户提供需要通过解析文档捕获的数据,避免复杂的正则表达式。
准备:源代码
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
def get_allele_feq(browser, snp):
browser.get(
'https://www.ncbi.nlm.nih.gov/v ... 39%3B %snp) #Load page
# browser.implicitly_wait(60) #智能等待xx秒
time.sleep(30) #加载时间较长,等待加载完毕
# browser.find_element_by_css_selector("div[title=\"Han Chinese in Bejing, China\"]") #use selenium function to find elements
# 把selenium的webdriver调用page_source函数在传入BeautifulSoup中,就可以用BeautifulSoup解析网页了
bs = BeautifulSoup(browser.page_source, "lxml")
# bs.find_all("div", title="Han Chinese in Bejing, China")
try:
race = bs.find(string="CHB")
race_data = race.find_parent("div").find_parent(
"div").find_next_sibling("div")
# print race_data
race_feq = race_data.find("span", class_="gt-selected").find_all("li") # class_ 防止Python中类关键字重复,产生语法错误
base1_feq = race_feq[0].text #获取标签的内容
base2_feq = race_feq[1].text
return snp, base1_feq, base2_feq # T=0.1408 C=0.8592
except NoSuchElementException:
return "%s:can't find element" %snp
def main():
browser = webdriver.Chrome() # Get local session of chrome
fh = open("./4diseases_snps_1kCHB_allele_feq.list2", 'w')
snps = open("./4diseases_snps.list.uniq2",'r')
for line in snps:
snp = line.strip()
response = get_allele_feq(browser, snp)
time.sleep(1)
fh.write("\t".join(response)) #unicode 编码的对象写到文件中后相当于print效果
fh.write("\n")
print "\t".join(response)
time.sleep(1) # sleep a few seconds
fh.close()
browser.quit() # 退出并关闭窗口的每一个相关的驱动程序
if __name__ == '__main__':
main()
参考资料:
1]:#美丽汤4.4.0个文件
2]:
3]:
4]:
5]:
6]:
7]: 查看全部
python抓取动态网页(千人基因组数据库中爬取CHB人群的等位基因频率信息解析)
该计划的目的:
根据特定的SNP列表,从千基因组数据库中爬取CHB群体的等位基因频率信息,例如。
因为网页是动态数据,内嵌了JavaScript代码,所以使用selenium来爬取信息。
Beautiful Soup 是一个python 库,主要功能是从网页中抓取数据。Beautiful Soup 提供了一些简单的、python 风格的函数来处理导航、搜索、修改分析树和其他功能。它是一个工具箱,为用户提供需要通过解析文档捕获的数据,避免复杂的正则表达式。
准备:源代码
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
def get_allele_feq(browser, snp):
browser.get(
'https://www.ncbi.nlm.nih.gov/v ... 39%3B %snp) #Load page
# browser.implicitly_wait(60) #智能等待xx秒
time.sleep(30) #加载时间较长,等待加载完毕
# browser.find_element_by_css_selector("div[title=\"Han Chinese in Bejing, China\"]") #use selenium function to find elements
# 把selenium的webdriver调用page_source函数在传入BeautifulSoup中,就可以用BeautifulSoup解析网页了
bs = BeautifulSoup(browser.page_source, "lxml")
# bs.find_all("div", title="Han Chinese in Bejing, China")
try:
race = bs.find(string="CHB")
race_data = race.find_parent("div").find_parent(
"div").find_next_sibling("div")
# print race_data
race_feq = race_data.find("span", class_="gt-selected").find_all("li") # class_ 防止Python中类关键字重复,产生语法错误
base1_feq = race_feq[0].text #获取标签的内容
base2_feq = race_feq[1].text
return snp, base1_feq, base2_feq # T=0.1408 C=0.8592
except NoSuchElementException:
return "%s:can't find element" %snp
def main():
browser = webdriver.Chrome() # Get local session of chrome
fh = open("./4diseases_snps_1kCHB_allele_feq.list2", 'w')
snps = open("./4diseases_snps.list.uniq2",'r')
for line in snps:
snp = line.strip()
response = get_allele_feq(browser, snp)
time.sleep(1)
fh.write("\t".join(response)) #unicode 编码的对象写到文件中后相当于print效果
fh.write("\n")
print "\t".join(response)
time.sleep(1) # sleep a few seconds
fh.close()
browser.quit() # 退出并关闭窗口的每一个相关的驱动程序
if __name__ == '__main__':
main()
参考资料:
1]:#美丽汤4.4.0个文件
2]:
3]:
4]:
5]:
6]:
7]:
python抓取动态网页(工具分析登录页面打开登录过程从分析可以看到哪些信息)
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2021-11-29 20:25
最近的项目在做一些数据整合,各个系统对应的接口就更奇怪了。数据整合的过程可以用八个字来概括:山中有路,水中有桥。
这两天碰巧出了问题。我们要集成的WEB系统没有提供专门的数据集成接口,没有API可以调整,也不允许访问数据库。无奈中,想知道能不能用python自动爬取。页。网页有SSO,应该使用开源的CAS框架,后面的页面都是动态JS和AJAX异步加载的。显然,这不像是直接使用Scrapy上传的普通静态页面。它必须是完美的。要模拟登陆动作,抓取后续动态内容,对页面结构和抓取内容的分析必不可少。
工具分析登陆页面
打开登录页面,按F12打开Chrome自带的分析工具。在Network选项卡中,可以看到当前浏览器显示页面的详细信息和提交的登录信息,如下图
网站 登录页面
从截图中可以看到,当我们访问app/this url的日志时,由于我们还没有登录,SSO会自动将我们重定向到登录页面,所以http状态是302重定向。
接下来,我们在页面输入账号密码,点击登录按钮,通过页面跟踪分析和模拟整个登录过程。这个过程一定要特别小心,因为很多CAS在登录页面都埋了很多隐藏的标记,一处是模仿不来的。它将无法登录,然后被重定向到开头。
分析登录过程
从分析中可以看出,在提交登录按钮时,会通过POST提交一个表单。除了账号、密码等显眼的字段外,表格中还有一个lt。经验告诉我们,这个字段应该隐藏在之前的登录页面上。它用于验证登录页面的合法性,因此我们需要从登录页面中查找并提取此信息。同时注意http的消息头。最好根据浏览器抓到的消息头来构造,因为网站也会验证里面的信息。
以下是登录的主要代码。我们基于python3和requests包处理https访问请求,模拟浏览器的行为,构造认证所需的信息并发送给网站。
import requestsimport urllib3from lxml import etreefrom ows_scrapy.ows_spider.write_csv import write_list_to_csv
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
s = requests.session()
s.trust_env = False # fastercookie = Noneusername = 'username'password = 'pwd'def login():
header = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=73E10849812940333A4AD2A2ABAEFB7D8CFF3E76A45340FFB687FD587D2EB97A49FC5F156D09DB1E17F129465AB8D8EBACEC', 'Host': '', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
form_data = { 'username': username, 'password': password, '_eventId': 'submit', 'pwdfirst': password[0:2], 'pwdsecond': password[2:5], 'pwdthird': password[5:]
}
login_url = 'https://.com/app/'
print('login...')
res = s.get(login_url, headers=header, verify=False) global cookie
cookie = res.cookies # 注意要保存cookie
print("get response from ows {0}, http status {1}".format(login_url, res.status_code))
login_url = res.url
header['Referer'] = login_url
header['Cookie'] = 'JSESSIONID=' + cookie['JSESSIONID']
form_data['lt'] = str(etree.HTML(res.content).xpath('//input[@name="lt"]/@value')[0]) #用xpath从页面上提取lt
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
cookie = res.cookies
print("post login params to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie))
res = s.send(res.next, allow_redirects=False, verify=False)
cookie = res.cookies
print("redirect to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie)) if res.status_code == 200 or res.status_code == 302: if cookie is not None and cookie.get(name='JSESSIONID', path='/app') is not None :
print('Successful login.') else:
print('WRONG w3id/password!')
sys.exit(0)
这里要特别注意,因为http是无状态的,需要cookies来保存网页的登录状态。页面成功后,页面的响应中会收录一个带有有效标记的cookie。登录的最终目的是获取并保存这个有效的cookie,这样后续的访问就不会被重定向到登录页面。
在 requests 方法中,只需将 cookie 添加到请求中即可。
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
分析动态内容页面
在动态页面中,页面显示的内容往往是通过js或者AJAX异步获取的,这明显不同于静态html页面的分析过程。使用 Chrome 的分析工具也可以轻松获取此信息。
分析动态页面
动态页面加载完成后,我们从所有请求中过滤XHR类型,找到我们想要的请求,然后在请求的Preview中就可以看到完整的对应信息了,请求的URL也可以从Obtained中查看在“标题”选项卡中。
接下来要做的和上面类似,构造一个消息来模拟浏览器向网站发送请求:
def get_content(order_id):
form_data = { 'roarand': 'BW09el5W3mW2sfbGbtWe7mWlwBsWqXg6znppnqkW3woJ5fcz5DnhfWXGonqkLsd0', 'start': '0', 'limit': '20', 'orderid': order_id, 'serviceId': 'test_gscsocsecurityincidentmanage_log_getList2'
}
header = { 'Accept': 'text/plain, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Host': '.com', 'Origin': 'https://.com', 'Referer': 'https://.com/app/104h/spl/test/ID_480_1511441539904_workflowdetail.spl?orderid=SOC-20180220-00000003', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest'
}
print('Start to scan order id ' + order_id)
url = 'https://.com/app/pageservices/service.do?forAccessLog={serviceName:test_gscsocsecurityincidentmanage_log_getList2,userId:571bdd42-10ca-4ce1-b41c-8a3f6632141f,tenantId:104h}&trackId=fec68f8e-f30a-4fa1-a8b1-41d3dd11fa4c'
res = s.post(url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False) #要加载上面登录成功的cookie
print(res.content) return res
重点其实就是从XHR中找到请求的URI,构造请求头并提交表单,最后一定要加上一个登录成功的cookie,否则会被重定向到登录页面。
有很多方法可以抓取动态页面。这种方式依赖的包相对较少,代码也比较灵活。爬取复杂登录页面时效果更好,但在分析页面登录机制时一定要特别小心。 查看全部
python抓取动态网页(工具分析登录页面打开登录过程从分析可以看到哪些信息)
最近的项目在做一些数据整合,各个系统对应的接口就更奇怪了。数据整合的过程可以用八个字来概括:山中有路,水中有桥。
这两天碰巧出了问题。我们要集成的WEB系统没有提供专门的数据集成接口,没有API可以调整,也不允许访问数据库。无奈中,想知道能不能用python自动爬取。页。网页有SSO,应该使用开源的CAS框架,后面的页面都是动态JS和AJAX异步加载的。显然,这不像是直接使用Scrapy上传的普通静态页面。它必须是完美的。要模拟登陆动作,抓取后续动态内容,对页面结构和抓取内容的分析必不可少。
工具分析登陆页面
打开登录页面,按F12打开Chrome自带的分析工具。在Network选项卡中,可以看到当前浏览器显示页面的详细信息和提交的登录信息,如下图

网站 登录页面
从截图中可以看到,当我们访问app/this url的日志时,由于我们还没有登录,SSO会自动将我们重定向到登录页面,所以http状态是302重定向。
接下来,我们在页面输入账号密码,点击登录按钮,通过页面跟踪分析和模拟整个登录过程。这个过程一定要特别小心,因为很多CAS在登录页面都埋了很多隐藏的标记,一处是模仿不来的。它将无法登录,然后被重定向到开头。
分析登录过程
从分析中可以看出,在提交登录按钮时,会通过POST提交一个表单。除了账号、密码等显眼的字段外,表格中还有一个lt。经验告诉我们,这个字段应该隐藏在之前的登录页面上。它用于验证登录页面的合法性,因此我们需要从登录页面中查找并提取此信息。同时注意http的消息头。最好根据浏览器抓到的消息头来构造,因为网站也会验证里面的信息。
以下是登录的主要代码。我们基于python3和requests包处理https访问请求,模拟浏览器的行为,构造认证所需的信息并发送给网站。
import requestsimport urllib3from lxml import etreefrom ows_scrapy.ows_spider.write_csv import write_list_to_csv
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
s = requests.session()
s.trust_env = False # fastercookie = Noneusername = 'username'password = 'pwd'def login():
header = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=73E10849812940333A4AD2A2ABAEFB7D8CFF3E76A45340FFB687FD587D2EB97A49FC5F156D09DB1E17F129465AB8D8EBACEC', 'Host': '', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
form_data = { 'username': username, 'password': password, '_eventId': 'submit', 'pwdfirst': password[0:2], 'pwdsecond': password[2:5], 'pwdthird': password[5:]
}
login_url = 'https://.com/app/'
print('login...')
res = s.get(login_url, headers=header, verify=False) global cookie
cookie = res.cookies # 注意要保存cookie
print("get response from ows {0}, http status {1}".format(login_url, res.status_code))
login_url = res.url
header['Referer'] = login_url
header['Cookie'] = 'JSESSIONID=' + cookie['JSESSIONID']
form_data['lt'] = str(etree.HTML(res.content).xpath('//input[@name="lt"]/@value')[0]) #用xpath从页面上提取lt
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
cookie = res.cookies
print("post login params to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie))
res = s.send(res.next, allow_redirects=False, verify=False)
cookie = res.cookies
print("redirect to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie)) if res.status_code == 200 or res.status_code == 302: if cookie is not None and cookie.get(name='JSESSIONID', path='/app') is not None :
print('Successful login.') else:
print('WRONG w3id/password!')
sys.exit(0)
这里要特别注意,因为http是无状态的,需要cookies来保存网页的登录状态。页面成功后,页面的响应中会收录一个带有有效标记的cookie。登录的最终目的是获取并保存这个有效的cookie,这样后续的访问就不会被重定向到登录页面。
在 requests 方法中,只需将 cookie 添加到请求中即可。
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
分析动态内容页面
在动态页面中,页面显示的内容往往是通过js或者AJAX异步获取的,这明显不同于静态html页面的分析过程。使用 Chrome 的分析工具也可以轻松获取此信息。

分析动态页面
动态页面加载完成后,我们从所有请求中过滤XHR类型,找到我们想要的请求,然后在请求的Preview中就可以看到完整的对应信息了,请求的URL也可以从Obtained中查看在“标题”选项卡中。
接下来要做的和上面类似,构造一个消息来模拟浏览器向网站发送请求:
def get_content(order_id):
form_data = { 'roarand': 'BW09el5W3mW2sfbGbtWe7mWlwBsWqXg6znppnqkW3woJ5fcz5DnhfWXGonqkLsd0', 'start': '0', 'limit': '20', 'orderid': order_id, 'serviceId': 'test_gscsocsecurityincidentmanage_log_getList2'
}
header = { 'Accept': 'text/plain, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Host': '.com', 'Origin': 'https://.com', 'Referer': 'https://.com/app/104h/spl/test/ID_480_1511441539904_workflowdetail.spl?orderid=SOC-20180220-00000003', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest'
}
print('Start to scan order id ' + order_id)
url = 'https://.com/app/pageservices/service.do?forAccessLog={serviceName:test_gscsocsecurityincidentmanage_log_getList2,userId:571bdd42-10ca-4ce1-b41c-8a3f6632141f,tenantId:104h}&trackId=fec68f8e-f30a-4fa1-a8b1-41d3dd11fa4c'
res = s.post(url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False) #要加载上面登录成功的cookie
print(res.content) return res
重点其实就是从XHR中找到请求的URI,构造请求头并提交表单,最后一定要加上一个登录成功的cookie,否则会被重定向到登录页面。
有很多方法可以抓取动态页面。这种方式依赖的包相对较少,代码也比较灵活。爬取复杂登录页面时效果更好,但在分析页面登录机制时一定要特别小心。
python抓取动态网页(使用selenium爬取动态网页信息Pythonselenium自动控制 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2021-12-19 13:26
)
使用selenium抓取动态网页信息
Python selenium自动控制浏览器抓取网页的数据,包括按钮点击、页面跳转、搜索框输入、页面值数据存储、mongodb自动id识别等。
首先介绍一下Python selenium——一种用于控制浏览器对网页操作的自动化测试工具。将它与爬虫中的 BeautifulSoup 结合起来是无缝的。除了国外的一些异常的验证网页,图片验证码我有自己的破解码。图片验证码源代码成功率为85%。
使用 conda butler 安装:
在cmd命令行输入“conda install selenium”进行安装
您还需要安装 Google Chrome Drive 或 Firefox 浏览器插件
设置环境变量
通过硒访问百度
from selenium import webdriver
#打开一个浏览器
browser = webdriver.Chrome()
#准备一个网址
url = 'http://www.baidu.com'
browser.get(url)
#获取元素
login = browser.find_elements_by_class_name('lb')[0]
print(login)
获取网易云音乐
from selenium import webdriver
#打开浏览器
brower = webdriver.Chrome()
url='https://music.163.com/#/discover/toplist'
brower.get(url)
#寻找logo文字
#logo = brower.find_elements_by_class_name('logo')[0]
#print(logo.text)
#一般情况下动态加载的内容都可以找到
#有一种情况就没有
#就是网页内存在网页框架iframe
#需要切换网页的层级
#语法:brower.switch_to.frame(iframe的id或者你提前获取这个对象,放入此处)
#方法一:id
#brower.switch_to.frame('g_iframe')
#方法二:name
#brower.switch_to.frame('contentFrame')
#方法三:提前用变量存iframe
iframe = brower.find_element_by_id('g_iframe')
brower.switch_to.frame(iframe)
#寻找大容器
toplist = brower.find_element_by_id('toplist')
#寻找tbody 通过标签名
tbody = toplist.find_elements_by_tag_name('tbody')[0]
#寻找所有tr
trs = tbody.find_elements_by_tag_name('tr')
dataList = []
for each in trs:
#排名
rank = each.find_elements_by_tag_name('td')[0].find_elements_by_class_name('num')[0].text
musicName = each.find_elements_by_tag_name('td')[1].find_elements_by_class_name('txt')[0].\
find_element_by_tag_name('b').get_attribute('title')
#print(musicName)
singer = each.find_elements_by_tag_name('td')[3].find_elements_by_class_name('text')[0].\
get_attribute('title')
#print(singer)
dataList.append([rank,musicName,singer])
#print(dataList)
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = '云音乐飙升榜'
ws.append(['排名','歌名','歌手'])
for data in dataList:
ws.append(data)
wb.save("云音乐飙升榜.xlsx") 查看全部
python抓取动态网页(使用selenium爬取动态网页信息Pythonselenium自动控制
)
使用selenium抓取动态网页信息
Python selenium自动控制浏览器抓取网页的数据,包括按钮点击、页面跳转、搜索框输入、页面值数据存储、mongodb自动id识别等。
首先介绍一下Python selenium——一种用于控制浏览器对网页操作的自动化测试工具。将它与爬虫中的 BeautifulSoup 结合起来是无缝的。除了国外的一些异常的验证网页,图片验证码我有自己的破解码。图片验证码源代码成功率为85%。
使用 conda butler 安装:
在cmd命令行输入“conda install selenium”进行安装
您还需要安装 Google Chrome Drive 或 Firefox 浏览器插件
设置环境变量
通过硒访问百度
from selenium import webdriver
#打开一个浏览器
browser = webdriver.Chrome()
#准备一个网址
url = 'http://www.baidu.com'
browser.get(url)
#获取元素
login = browser.find_elements_by_class_name('lb')[0]
print(login)
获取网易云音乐
from selenium import webdriver
#打开浏览器
brower = webdriver.Chrome()
url='https://music.163.com/#/discover/toplist'
brower.get(url)
#寻找logo文字
#logo = brower.find_elements_by_class_name('logo')[0]
#print(logo.text)
#一般情况下动态加载的内容都可以找到
#有一种情况就没有
#就是网页内存在网页框架iframe
#需要切换网页的层级
#语法:brower.switch_to.frame(iframe的id或者你提前获取这个对象,放入此处)
#方法一:id
#brower.switch_to.frame('g_iframe')
#方法二:name
#brower.switch_to.frame('contentFrame')
#方法三:提前用变量存iframe
iframe = brower.find_element_by_id('g_iframe')
brower.switch_to.frame(iframe)
#寻找大容器
toplist = brower.find_element_by_id('toplist')
#寻找tbody 通过标签名
tbody = toplist.find_elements_by_tag_name('tbody')[0]
#寻找所有tr
trs = tbody.find_elements_by_tag_name('tr')
dataList = []
for each in trs:
#排名
rank = each.find_elements_by_tag_name('td')[0].find_elements_by_class_name('num')[0].text
musicName = each.find_elements_by_tag_name('td')[1].find_elements_by_class_name('txt')[0].\
find_element_by_tag_name('b').get_attribute('title')
#print(musicName)
singer = each.find_elements_by_tag_name('td')[3].find_elements_by_class_name('text')[0].\
get_attribute('title')
#print(singer)
dataList.append([rank,musicName,singer])
#print(dataList)
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = '云音乐飙升榜'
ws.append(['排名','歌名','歌手'])
for data in dataList:
ws.append(data)
wb.save("云音乐飙升榜.xlsx")
python抓取动态网页(Python网络爬虫内容提取器)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-19 04:05
1、简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2、提取动态内容的技术组件
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是部分Ajax动态内容在源码中是找不到的,需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码和实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
第一步:利用直观的采集搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面即可在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub上找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取
4、阅读下一个
到目前为止,我们已经通过两篇文章 文章演示了如何抓取静态和动态的网页内容,这两篇文章都使用xslt 一次性从网页中提取所需的内容。实际上,xslt 是一种更复杂的编程语言。如果你手工写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这就说得通了,程序员不再花时间编写和调试捕获规则,这是一项非常耗时费力的工作。下一篇《1分钟快速生成用于Web内容提取的Xslt》将介绍如何生成xslt。
5、Jisouke GooSeeker开源代码下载源码
1. GooSeeker开源Python网络爬虫GitHub源码
6、文档修订历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源,修改github源码地址 查看全部
python抓取动态网页(Python网络爬虫内容提取器)
1、简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2、提取动态内容的技术组件
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是部分Ajax动态内容在源码中是找不到的,需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码和实验过程
假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:

第一步:利用直观的采集搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面即可在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。

第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub上找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取

4、阅读下一个
到目前为止,我们已经通过两篇文章 文章演示了如何抓取静态和动态的网页内容,这两篇文章都使用xslt 一次性从网页中提取所需的内容。实际上,xslt 是一种更复杂的编程语言。如果你手工写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这就说得通了,程序员不再花时间编写和调试捕获规则,这是一项非常耗时费力的工作。下一篇《1分钟快速生成用于Web内容提取的Xslt》将介绍如何生成xslt。
5、Jisouke GooSeeker开源代码下载源码
1. GooSeeker开源Python网络爬虫GitHub源码
6、文档修订历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源,修改github源码地址
python抓取动态网页(如何用python来抓取页面中的JS动态加载的数据 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2021-12-18 05:14
)
我们经常发现网页中的很多数据并不是硬编码在HTML中,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前是没有的。
在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果你还是直接从网页上爬取,你将无法获取任何数据。
今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
如下图,我们在HTML中找不到对应的电影信息。
在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:
在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
我们可以看到它使用了AJAX异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某一部分,从而实现数据的动态加载。
我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。
查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然,它们的意思是:“从某个位置返回的电影数量”。
如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
但这看起来很不自动化,很多其他的网站 RequestURL 没有那么简单,所以我们将使用python 进行进一步的操作,以获取返回的消息信息。
#coding:utf-8
import urllib
import requests
post_param = {'action':'','start':'0','limit':'1'}
return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False)
print return_data.text 查看全部
python抓取动态网页(如何用python来抓取页面中的JS动态加载的数据
)
我们经常发现网页中的很多数据并不是硬编码在HTML中,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前是没有的。
在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果你还是直接从网页上爬取,你将无法获取任何数据。
今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
如下图,我们在HTML中找不到对应的电影信息。


在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:

在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
我们可以看到它使用了AJAX异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某一部分,从而实现数据的动态加载。

我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。

查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然,它们的意思是:“从某个位置返回的电影数量”。
如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
但这看起来很不自动化,很多其他的网站 RequestURL 没有那么简单,所以我们将使用python 进行进一步的操作,以获取返回的消息信息。
#coding:utf-8
import urllib
import requests
post_param = {'action':'','start':'0','limit':'1'}
return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False)
print return_data.text
python抓取动态网页(利用selenium的子模块webdriver的html内容解决的问题)
网站优化 • 优采云 发表了文章 • 0 个评论 • 34 次浏览 • 2021-12-18 05:12
文章目的
我们在使用Python爬取网页数据时,经常会用到urllib模块,它通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获取网页的html内容url,然后使用 BeautifulSoup 抓取某个 Label 内容,结合正则表达式过滤。但是,您使用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容。很多动态数据(比如网站访问量、当前在线数、微博点赞数等)都没有收录在静态html中,比如我想在里面抓取每个版块的当前在线数这个bbs网站,不收录静态html网页(不信你去查一下页面的源码,只有简单的一行)。
解决方案
我试过网上说的用浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具)查看网络获取动态数据的趋势,但这需要从许多网址。个人觉得太麻烦。另外,查看器查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何将查看器的html导入python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
偶然发现了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,找到当前session对应的tag。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一些重要的动态数据。事实上,selenium 模块的功能不仅限于抓取网页。它是自动化网络测试的常用模块。它在 Ruby 和 Java 中被广泛使用。Python虽然使用的相对较少,但它也是一个非常简单、高效、易用的自动化测试。模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,你也可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
实现流程运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有自带selenium,直接在Python程序中导入selenium会提示没有这样的模块,在联网状态下,cmd直接进入pip install selenium,系统会找到Python安装目录,直接下载解压安装这个模块。终端提示完成后,可以查看C:\Python27\Lib\site-packages目录下是否有selenium模块。这个目录取决于你安装 Python 的路径。如果有 selenium 和 selenium-2.47.3.dist-info 两个文件夹,则可以在 Python 程序中加载模块。
使用 webdriver 捕获动态数据
1.首先导入webdriver子模块
从硒导入网络驱动程序
2.获取浏览器会话,浏览器可以使用火狐、Chrome、IE等,这里以火狐为例
浏览器 = webdriver.Firefox()
3.加载页面,只需在url中指定一个有效字符串
browser.get(url)
4. 获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
名称
班级名称
关联
文本
部分的
关联
文本
标签
名称
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考《博客园-冲实》大神的selenium webdriver(python)教程第三章-定位方法(第一版可百度文库阅读,第二版为开始收费 >- 查看全部
python抓取动态网页(利用selenium的子模块webdriver的html内容解决的问题)
文章目的
我们在使用Python爬取网页数据时,经常会用到urllib模块,它通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获取网页的html内容url,然后使用 BeautifulSoup 抓取某个 Label 内容,结合正则表达式过滤。但是,您使用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容。很多动态数据(比如网站访问量、当前在线数、微博点赞数等)都没有收录在静态html中,比如我想在里面抓取每个版块的当前在线数这个bbs网站,不收录静态html网页(不信你去查一下页面的源码,只有简单的一行)。
解决方案
我试过网上说的用浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具)查看网络获取动态数据的趋势,但这需要从许多网址。个人觉得太麻烦。另外,查看器查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何将查看器的html导入python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
偶然发现了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,找到当前session对应的tag。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一些重要的动态数据。事实上,selenium 模块的功能不仅限于抓取网页。它是自动化网络测试的常用模块。它在 Ruby 和 Java 中被广泛使用。Python虽然使用的相对较少,但它也是一个非常简单、高效、易用的自动化测试。模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,你也可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
实现流程运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有自带selenium,直接在Python程序中导入selenium会提示没有这样的模块,在联网状态下,cmd直接进入pip install selenium,系统会找到Python安装目录,直接下载解压安装这个模块。终端提示完成后,可以查看C:\Python27\Lib\site-packages目录下是否有selenium模块。这个目录取决于你安装 Python 的路径。如果有 selenium 和 selenium-2.47.3.dist-info 两个文件夹,则可以在 Python 程序中加载模块。
使用 webdriver 捕获动态数据
1.首先导入webdriver子模块
从硒导入网络驱动程序
2.获取浏览器会话,浏览器可以使用火狐、Chrome、IE等,这里以火狐为例
浏览器 = webdriver.Firefox()
3.加载页面,只需在url中指定一个有效字符串
browser.get(url)
4. 获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
名称
班级名称
关联
文本
部分的
关联
文本
标签
名称
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考《博客园-冲实》大神的selenium webdriver(python)教程第三章-定位方法(第一版可百度文库阅读,第二版为开始收费 >-
python抓取动态网页( 为啥写这篇文章?前两篇文章我们分别介绍了文章目录分析页面)
网站优化 • 优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2021-12-16 10:08
为啥写这篇文章?前两篇文章我们分别介绍了文章目录分析页面)
为什么要写这个文章?
我们介绍了前两个文章
文章内容
分析页面
首先打开小餐桌网站。经过简单的分析,我们可以得出三个结论。
点击查看更多数据后,页面地址不变,页面不会刷新。单击以查看更多一次将请求一个界面。页面的数据以application/json的形式由接口返回。p 参数控制返回哪一页数据。n 参数控制每页返回的数据项数。什么是阿贾克斯
AJAX(Asynchronouse JavaScript And XML)中文称为异步JavaScript和XML。主要用于前端和服务器端进行少量数据交互。Ajax 可以实现网页的异步加载,这意味着可以在不重新加载整个网页的情况下部分更新网页的某个部分。如果内容需要更新,传统网页(不使用 Ajax)需要重新加载整个网页。
因为传统的数据传输格式是XML语法,所以称为AJAX。其实现在数据交互基本都是用JSON。使用ajax加载的数据,即使使用js,数据渲染到浏览器中,右键---->查看网页源码,仍然看不到通过ajax加载的数据,只加载了html带有网址代码。
获取ajax数据的方法直接分析ajax调用的接口,然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。(下面文章会详细介绍)获取数据
这个小饭桌网站的界面比较简单,没有加密认证什么的,直接通过requests请求即可。下面给出了一个示例代码:
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"
}
requests.packages.urllib3.disable_warnings()
if __name__ == '__main__':
for i in range(1,10):
url = "https://www.xfz.cn/api/website/articles/?p={0}&n=20&type=".format(str(i))
resp = requests.get(url, headers=headers, verify=False)
print(resp.json())
操作结果:
总结
本文以小凡表网站为例,简单介绍一下如何抓取动态网页的数据。
粉丝专属福利
软试材料:实用软试材料
面试题:5G Java高频面试题
学习资料:各种学习资料50G 查看全部
python抓取动态网页(
为啥写这篇文章?前两篇文章我们分别介绍了文章目录分析页面)

为什么要写这个文章?
我们介绍了前两个文章
文章内容
分析页面
首先打开小餐桌网站。经过简单的分析,我们可以得出三个结论。

点击查看更多数据后,页面地址不变,页面不会刷新。单击以查看更多一次将请求一个界面。页面的数据以application/json的形式由接口返回。p 参数控制返回哪一页数据。n 参数控制每页返回的数据项数。什么是阿贾克斯
AJAX(Asynchronouse JavaScript And XML)中文称为异步JavaScript和XML。主要用于前端和服务器端进行少量数据交互。Ajax 可以实现网页的异步加载,这意味着可以在不重新加载整个网页的情况下部分更新网页的某个部分。如果内容需要更新,传统网页(不使用 Ajax)需要重新加载整个网页。
因为传统的数据传输格式是XML语法,所以称为AJAX。其实现在数据交互基本都是用JSON。使用ajax加载的数据,即使使用js,数据渲染到浏览器中,右键---->查看网页源码,仍然看不到通过ajax加载的数据,只加载了html带有网址代码。
获取ajax数据的方法直接分析ajax调用的接口,然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。(下面文章会详细介绍)获取数据
这个小饭桌网站的界面比较简单,没有加密认证什么的,直接通过requests请求即可。下面给出了一个示例代码:
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"
}
requests.packages.urllib3.disable_warnings()
if __name__ == '__main__':
for i in range(1,10):
url = "https://www.xfz.cn/api/website/articles/?p={0}&n=20&type=".format(str(i))
resp = requests.get(url, headers=headers, verify=False)
print(resp.json())
操作结果:

总结
本文以小凡表网站为例,简单介绍一下如何抓取动态网页的数据。
粉丝专属福利
软试材料:实用软试材料
面试题:5G Java高频面试题
学习资料:各种学习资料50G
python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)
网站优化 • 优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-14 20:38
用python爬取网站数据很方便,效率也很高,但是常用的BeautifSoup和requests的组合一般用于爬取静态页面(即网页上显示的数据)可以在html源码中找到,不是网站通过js或者ajax异步加载的),这种网站数据比较容易爬取。但是网站上的一些数据是通过执行js代码更新的。这时候,传统的方法就不那么适用了。这种情况下有几种方法:
清除网页上的网络信息,更新页面,观察网页发送的请求。一些网站可以通过这种方式构造参数来简化爬虫。但适用范围还不够广。
使用 selenium 模拟浏览器行为来更新网页以获得更新的数据。本文的其余部分将重点介绍这种方法。
一、准备
需要两个工具来模拟浏览器:
1.selenium,可以直接通过pip install selenium安装。
2.PhantomJS,这是一个无界面、脚本可编程的 WebKit 浏览器引擎。百度从其官方网站搜索并下载。下载后,无需安装。放在指定的路径。您只需要指定文件所在的路径即可。
二、使用selenium模拟浏览器
本文爬取网站的例子是:8099/ths-report/...
学习示例时请不要抓取太多页面,只需通过过程了解如何抓取它。
打开网站后可以看到要爬取的数据是一个普通的表,但是页面很多。
在这个网站中,点击下一页的页面的url没有变化,通过执行一段js代码来更新页面。所以本文的思路是用selenium模拟浏览器点击,点击“下一步”更新页面数据,获取更新后的页面数据。这是完整的代码:
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import json
import time
from selenium import webdriver
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
curpath=sys.path[0]
print curpath
def getData(url):
# 使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便
driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")
driver.set_page_load_timeout(30)
time.sleep(3)
html=driver.get(url[0]) # 使用get方法请求url,因为是模拟浏览器,所以不需要headers信息
for page in range(3):
html=driver.page_source # 获取网页的html数据
soup=BeautifulSoup(html,'lxml') # 对html进行解析,如果提示lxml未安装,直接pip install lxml即可
table=soup.find('table',class_="report-table")
name=[]
for th in table.find_all('tr')[0].find_all('th'):
name.append(th.get_text()) # 获取表格的字段名称作为字典的键
flag=0 # 标记,当爬取字段数据是为0,否则为1
for tr in table.find_all('tr'):
# 第一行为表格字段数据,因此跳过第一行
if flag==1:
dic={}
i=0
for td in tr.find_all('td'):
dic[name[i]]=td.get_text()
i+=1
jsonDump(dic,url[1])#保存数据
flag=1
# 利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可
driver.find_element_by_link_text(u"下一页").click()
def jsonDump(_json,name):
"""store json data"""
with open(curpath+'/'+name+'.json','a') as outfile:
json.dump(_json,outfile,ensure_ascii=False)
with open(curpath+'/'+name+'.json','a') as outfile:
outfile.write(',\n')
if __name__ == '__main__':
url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc'] # yzc为文件名,此处输入中文会报错,前面加u也不行,只好保存后手动改文件名……
getData(url) # 调用函数
复制代码
本文通过driver.find_element_by_link_text方法获取下一页的位置。这是因为在这个网页中,这个标签没有唯一可识别的 id,也没有类。如果是通过xpath定位,第一页和其他页面的xpath路径不完全一样,需要加一个if来判断。所以直接通过链接的text参数进行定位。click() 函数模拟浏览器中的点击操作。
硒非常强大。可以解决很多普通爬虫无法解决的问题。可以模拟点击、鼠标移动、提交表单(应用如:登录邮箱账号、登录wifi等,网上例子很多,我暂时还没试过),当你遇到一些非常规网站数据爬取难度很大,不妨试试selenium+phantomjs。
最后:【可以帮到你】
这个资料应该是【软件测试】的朋友们最全面、最全的准备库了。这个仓库陪伴了数以万计的测试工程师走过最艰难的旅程,也希望能帮到你!关注我的微信公众号【软件测试道】免费获取~
我的学习交流群:644956177群内有技术高手交流分享~
如果我的博客对你有帮助,如果你喜欢我的博客内容,请一键“点赞”“评论”“采集”! 查看全部
python抓取动态网页(python模拟浏览器行为更新网页获取更新后的数据怎么抓)
用python爬取网站数据很方便,效率也很高,但是常用的BeautifSoup和requests的组合一般用于爬取静态页面(即网页上显示的数据)可以在html源码中找到,不是网站通过js或者ajax异步加载的),这种网站数据比较容易爬取。但是网站上的一些数据是通过执行js代码更新的。这时候,传统的方法就不那么适用了。这种情况下有几种方法:
清除网页上的网络信息,更新页面,观察网页发送的请求。一些网站可以通过这种方式构造参数来简化爬虫。但适用范围还不够广。
使用 selenium 模拟浏览器行为来更新网页以获得更新的数据。本文的其余部分将重点介绍这种方法。
一、准备
需要两个工具来模拟浏览器:
1.selenium,可以直接通过pip install selenium安装。
2.PhantomJS,这是一个无界面、脚本可编程的 WebKit 浏览器引擎。百度从其官方网站搜索并下载。下载后,无需安装。放在指定的路径。您只需要指定文件所在的路径即可。
二、使用selenium模拟浏览器
本文爬取网站的例子是:8099/ths-report/...
学习示例时请不要抓取太多页面,只需通过过程了解如何抓取它。
打开网站后可以看到要爬取的数据是一个普通的表,但是页面很多。
在这个网站中,点击下一页的页面的url没有变化,通过执行一段js代码来更新页面。所以本文的思路是用selenium模拟浏览器点击,点击“下一步”更新页面数据,获取更新后的页面数据。这是完整的代码:
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import json
import time
from selenium import webdriver
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
curpath=sys.path[0]
print curpath
def getData(url):
# 使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便
driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")
driver.set_page_load_timeout(30)
time.sleep(3)
html=driver.get(url[0]) # 使用get方法请求url,因为是模拟浏览器,所以不需要headers信息
for page in range(3):
html=driver.page_source # 获取网页的html数据
soup=BeautifulSoup(html,'lxml') # 对html进行解析,如果提示lxml未安装,直接pip install lxml即可
table=soup.find('table',class_="report-table")
name=[]
for th in table.find_all('tr')[0].find_all('th'):
name.append(th.get_text()) # 获取表格的字段名称作为字典的键
flag=0 # 标记,当爬取字段数据是为0,否则为1
for tr in table.find_all('tr'):
# 第一行为表格字段数据,因此跳过第一行
if flag==1:
dic={}
i=0
for td in tr.find_all('td'):
dic[name[i]]=td.get_text()
i+=1
jsonDump(dic,url[1])#保存数据
flag=1
# 利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可
driver.find_element_by_link_text(u"下一页").click()
def jsonDump(_json,name):
"""store json data"""
with open(curpath+'/'+name+'.json','a') as outfile:
json.dump(_json,outfile,ensure_ascii=False)
with open(curpath+'/'+name+'.json','a') as outfile:
outfile.write(',\n')
if __name__ == '__main__':
url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc'] # yzc为文件名,此处输入中文会报错,前面加u也不行,只好保存后手动改文件名……
getData(url) # 调用函数
复制代码
本文通过driver.find_element_by_link_text方法获取下一页的位置。这是因为在这个网页中,这个标签没有唯一可识别的 id,也没有类。如果是通过xpath定位,第一页和其他页面的xpath路径不完全一样,需要加一个if来判断。所以直接通过链接的text参数进行定位。click() 函数模拟浏览器中的点击操作。
硒非常强大。可以解决很多普通爬虫无法解决的问题。可以模拟点击、鼠标移动、提交表单(应用如:登录邮箱账号、登录wifi等,网上例子很多,我暂时还没试过),当你遇到一些非常规网站数据爬取难度很大,不妨试试selenium+phantomjs。
最后:【可以帮到你】
这个资料应该是【软件测试】的朋友们最全面、最全的准备库了。这个仓库陪伴了数以万计的测试工程师走过最艰难的旅程,也希望能帮到你!关注我的微信公众号【软件测试道】免费获取~
我的学习交流群:644956177群内有技术高手交流分享~
如果我的博客对你有帮助,如果你喜欢我的博客内容,请一键“点赞”“评论”“采集”!
python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-09 23:16
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:
可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:
然后直接点一个进去,复制url(右键复制链接地址)看看是什么:
原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l 查看全部
python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:

可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:

然后直接点一个进去,复制url(右键复制链接地址)看看是什么:

原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l
python抓取动态网页( Python将生成视频的缩略图内容类型的输出-教程)
网站优化 • 优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-12-09 07:20
Python将生成视频的缩略图内容类型的输出-教程)
r=requests.get(url, allow_redirects=True)
现在,我们可以获得有关 Web 服务器可以提供的内容的信息类型。
for headers in r.headers: print(headers)
您可以观察输出,如下所示 -
Date
Server
Upgrade
Connection
Last-Modified
Accept-Ranges
Content-Length
Keep-Alive
Content-Type
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如 content-type-
print (r.headers.get('content-type'))
您可以观察输出,如下所示 -
image/jpeg
借助以下几行代码,我们可以获得内容类型的具体信息,例如EType-
print (r.headers.get('ETag'))
您可以观察输出,如下所示 -
None
遵守以下命令——
print (r.headers.get('content-length'))
您可以观察输出,如下所示 -
12636
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如Server-
print (r.headers.get('Server'))
您可以观察输出,如下所示 -
Apache
生成缩略图
缩略图是非常小的描述或表示。用户可能只想保存大图像的缩略图,或者同时保存图像和缩略图。在本节中,我们将为上一节“从 Web 获取媒体内容”中下载的名为 ThinkBig.png 的图像创建缩略图。
对于这个 Python 脚本,我们需要安装一个名为 Pillow 的 Python 库,它是 Python Image 库的一个分支,具有处理图像的有用功能。
pip install pillow
以下 Python 脚本将创建图像的缩略图,并通过在缩略图文件前添加 Th _ 将其保存在当前目录中。
五牙教程网
import glob
from PIL import Image
for infile in glob.glob("ThinkBig.png"):
img=Image.open(infile)
img.thumbnail((128, 128), Image.ANTIALIAS)
if infile[0:2] != "Th_":
img.save("Th_" + infile, "png")
上面的代码很容易理解,可以查看当前目录下的缩略图文件。
网站 截图
在网络爬虫中,一个很常见的任务就是对网站进行截图。为了实现这一点,我们将使用 selenium 的 webdriver。以下 Python 脚本将从 网站 中截取屏幕截图并将其保存到当前目录。
From selenium import webdriver
path=r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser=webdriver.Chrome(executable_path=path)
browser.get('https://learnfk.com/')
screenshot=browser.save_screenshot('screenshot.png')
browser.quit
您可以观察输出,如下所示 -
DevTools listening on ws://127.0.0.1:1456/devtools/browser/488ed704-9f1b-44f0-
a571-892dc4c90eb7
运行脚本后,可以查看当前目录下的 screenshot.png 文件。
视频缩略图
假设我们已经从 网站 下载了一个视频,并且想要为其生成缩略图,以便我们可以根据其缩略图点击特定视频。要为视频生成缩略图,我们需要一个名为 ffmpeg 的简单工具,可以从 下载。下载后,我们需要根据操作系统的规格进行安装。
以下 Python 脚本将生成视频的缩略图并将其保存到我们的本地目录 -
import subprocess
video_MP4_file=“C:\Users\gaurav\desktop\solar.mp4
thumbnail_image_file='thumbnail_solar_video.jpg'
subprocess.call(['ffmpeg', '-i', video_MP4_file, '-ss', '00:00:20.000', '-
vframes', '1', thumbnail_image_file, "-y"])
运行上述脚本后,我们会得到一个名为thumbnail_solar_video.jpg 的缩略图,并将其保存在本地目录中。
MP4 转 MP3
假设你已经从网站下载了一些视频文件,但是只需要文件中的音频就可以使用,可以使用Python库中的moviepy这个Python库来完成这个操作,可以在帮助下安装以下命令的 -
pip install moviepy
现在,在以下脚本的帮助下成功安装moviepy后,我们可以将MP4转换为MP3。
import moviepy.editor as mp
clip=mp.VideoFileClip(r"C:\Users\gaurav\Desktop\1234.mp4")
clip.audio.write_audiofile("movie_audio.mp3")
您可以观察输出,如下所示 -
<p>[MoviePy] Writing audio in movie_audio.mp3
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 674/674 [00:01 查看全部
python抓取动态网页(
Python将生成视频的缩略图内容类型的输出-教程)
r=requests.get(url, allow_redirects=True)
现在,我们可以获得有关 Web 服务器可以提供的内容的信息类型。
for headers in r.headers: print(headers)
您可以观察输出,如下所示 -
Date
Server
Upgrade
Connection
Last-Modified
Accept-Ranges
Content-Length
Keep-Alive
Content-Type
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如 content-type-
print (r.headers.get('content-type'))
您可以观察输出,如下所示 -
image/jpeg
借助以下几行代码,我们可以获得内容类型的具体信息,例如EType-
print (r.headers.get('ETag'))
您可以观察输出,如下所示 -
None
遵守以下命令——
print (r.headers.get('content-length'))
您可以观察输出,如下所示 -
12636
借助以下几行代码,我们可以获得关于内容类型的具体信息,例如Server-
print (r.headers.get('Server'))
您可以观察输出,如下所示 -
Apache
生成缩略图
缩略图是非常小的描述或表示。用户可能只想保存大图像的缩略图,或者同时保存图像和缩略图。在本节中,我们将为上一节“从 Web 获取媒体内容”中下载的名为 ThinkBig.png 的图像创建缩略图。
对于这个 Python 脚本,我们需要安装一个名为 Pillow 的 Python 库,它是 Python Image 库的一个分支,具有处理图像的有用功能。
pip install pillow
以下 Python 脚本将创建图像的缩略图,并通过在缩略图文件前添加 Th _ 将其保存在当前目录中。
五牙教程网
import glob
from PIL import Image
for infile in glob.glob("ThinkBig.png"):
img=Image.open(infile)
img.thumbnail((128, 128), Image.ANTIALIAS)
if infile[0:2] != "Th_":
img.save("Th_" + infile, "png")
上面的代码很容易理解,可以查看当前目录下的缩略图文件。
网站 截图
在网络爬虫中,一个很常见的任务就是对网站进行截图。为了实现这一点,我们将使用 selenium 的 webdriver。以下 Python 脚本将从 网站 中截取屏幕截图并将其保存到当前目录。
From selenium import webdriver
path=r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser=webdriver.Chrome(executable_path=path)
browser.get('https://learnfk.com/')
screenshot=browser.save_screenshot('screenshot.png')
browser.quit
您可以观察输出,如下所示 -
DevTools listening on ws://127.0.0.1:1456/devtools/browser/488ed704-9f1b-44f0-
a571-892dc4c90eb7
运行脚本后,可以查看当前目录下的 screenshot.png 文件。
视频缩略图
假设我们已经从 网站 下载了一个视频,并且想要为其生成缩略图,以便我们可以根据其缩略图点击特定视频。要为视频生成缩略图,我们需要一个名为 ffmpeg 的简单工具,可以从 下载。下载后,我们需要根据操作系统的规格进行安装。
以下 Python 脚本将生成视频的缩略图并将其保存到我们的本地目录 -
import subprocess
video_MP4_file=“C:\Users\gaurav\desktop\solar.mp4
thumbnail_image_file='thumbnail_solar_video.jpg'
subprocess.call(['ffmpeg', '-i', video_MP4_file, '-ss', '00:00:20.000', '-
vframes', '1', thumbnail_image_file, "-y"])
运行上述脚本后,我们会得到一个名为thumbnail_solar_video.jpg 的缩略图,并将其保存在本地目录中。
MP4 转 MP3
假设你已经从网站下载了一些视频文件,但是只需要文件中的音频就可以使用,可以使用Python库中的moviepy这个Python库来完成这个操作,可以在帮助下安装以下命令的 -
pip install moviepy
现在,在以下脚本的帮助下成功安装moviepy后,我们可以将MP4转换为MP3。
import moviepy.editor as mp
clip=mp.VideoFileClip(r"C:\Users\gaurav\Desktop\1234.mp4")
clip.audio.write_audiofile("movie_audio.mp3")
您可以观察输出,如下所示 -
<p>[MoviePy] Writing audio in movie_audio.mp3
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 674/674 [00:01
python抓取动态网页(python技术之api接口_开发者中心==抓取动态网页)
网站优化 • 优采云 发表了文章 • 0 个评论 • 39 次浏览 • 2021-12-08 01:04
python抓取动态网页可以使用,该网站已经封堵该地址。
找到了一个安卓版app:httpwatcher/
同意上面。试了微信、新浪微博、豆瓣。没用。上面的网站不封闭,但是没反爬。普通app拿过来用用,可以。api的话只能拿一些分享图片和分享内容什么的。
apiview可以抓取微博所有分享。
没用过,不过可以走路件攻破,提供相关方法。
试一下这个:api接口_开发者中心===我曾经给微博后台添加过个安卓的单站api,貌似已经顺利拿下。
应该没有对应的封堵列表,
这个问题其实很容易解决,比如这个:微博抓取程序(动态htmltextpage)将站内抓取数据汇总后可以保存到本地吗?1.记录每条博文的id2.记录每条博文的发布时间3.将每条博文复制粘贴到记事本/word等能打开的地方。
建议关注公众号:android爬虫技术之api分享,
先注册一个公众号,然后安装客户端,微信公众号里面有api,也可以用, 查看全部
python抓取动态网页(python技术之api接口_开发者中心==抓取动态网页)
python抓取动态网页可以使用,该网站已经封堵该地址。
找到了一个安卓版app:httpwatcher/
同意上面。试了微信、新浪微博、豆瓣。没用。上面的网站不封闭,但是没反爬。普通app拿过来用用,可以。api的话只能拿一些分享图片和分享内容什么的。
apiview可以抓取微博所有分享。
没用过,不过可以走路件攻破,提供相关方法。
试一下这个:api接口_开发者中心===我曾经给微博后台添加过个安卓的单站api,貌似已经顺利拿下。
应该没有对应的封堵列表,
这个问题其实很容易解决,比如这个:微博抓取程序(动态htmltextpage)将站内抓取数据汇总后可以保存到本地吗?1.记录每条博文的id2.记录每条博文的发布时间3.将每条博文复制粘贴到记事本/word等能打开的地方。
建议关注公众号:android爬虫技术之api分享,
先注册一个公众号,然后安装客户端,微信公众号里面有api,也可以用,
python抓取动态网页(python网页爬虫怎么去爬数据(一)_抓取动态网页)
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-06 13:06
python抓取动态网页,特别是新闻报道动态内容。1.使用python写一个爬虫程序。2.抓取下来的数据,存放到数据库。3.使用其他爬虫程序,抓取数据库内的数据,发布到我们的网站。4.最后将新闻报道中的名字和标题编号等信息提取出来做数据可视化展示。5.每天读取新闻报道中的内容。并做简单的数据分析。
之前的回答确实可能不太清楚python网页爬虫具体怎么去爬数据,今天细细梳理一下这个问题的整个流程,方便其他相关专业的同学能够熟练使用这些工具。首先,要判断谁出的数据谁来抓:因为互联网中的网页数以万计,千千万万的页面,每个页面的内容可能都不同,所以,我们可以按照以下流程去分析:1.找到你爬取网页的网站header:ip=max(3000,10000)ips={}ip由于无法判断,所以最好是根据自己的ip进行判断,具体查看博客园的抓取过程及代码我的理解是:3000访问一个网站,500访问一个网站,可能会两个网站都建议抓,总之如果网站超过6000+,需要不断同步抓取。
那么用ip访问就有问题,因为你可能从ip不断发出的请求,目前规定是不能超过10000端口,否则adsl可能会过于繁忙,导致无法抓取。下面的抓取到页面内容部分讲解了ip的问题。以及,一定要提前分析你的网站,一个页面有多个header信息。注意:注意:注意:你的目标是web相关网站,所以想正则应该是要做正则匹配(如果不做正则匹配,curl命令在找页面时会无法被识别,只能从index_inurl的第一个字符开始搜),以及(搜索结果会由于ip过多,一些指定ip无法正确检索页面,可能会使用段代码)。
2.所有想要抓取的新闻页面的header参数有了,就可以进行爬取了(爬取前先看看你想抓取的页面:):请求速度,可以按抓取新闻页面前5个域名网址的速度进行筛选:page数/search_type数/page是不是4000/5000/10000!!!差5毫秒的就返回4050/2040/13000,差2毫秒的返回3050/2590/26000,好奇怪为什么,就为了截图么?为了避免重复遍历,请先看看新闻页面的结构。
解决方案:知乎回答一般是ajax加载页面,因此页面采用getpost,而后端可以采用post,可以传参数,也可以不传。爬虫抓取代码如下:processing.content.stop()//不会停止输出processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.strip()//开始弹出全屏画面processing。 查看全部
python抓取动态网页(python网页爬虫怎么去爬数据(一)_抓取动态网页)
python抓取动态网页,特别是新闻报道动态内容。1.使用python写一个爬虫程序。2.抓取下来的数据,存放到数据库。3.使用其他爬虫程序,抓取数据库内的数据,发布到我们的网站。4.最后将新闻报道中的名字和标题编号等信息提取出来做数据可视化展示。5.每天读取新闻报道中的内容。并做简单的数据分析。
之前的回答确实可能不太清楚python网页爬虫具体怎么去爬数据,今天细细梳理一下这个问题的整个流程,方便其他相关专业的同学能够熟练使用这些工具。首先,要判断谁出的数据谁来抓:因为互联网中的网页数以万计,千千万万的页面,每个页面的内容可能都不同,所以,我们可以按照以下流程去分析:1.找到你爬取网页的网站header:ip=max(3000,10000)ips={}ip由于无法判断,所以最好是根据自己的ip进行判断,具体查看博客园的抓取过程及代码我的理解是:3000访问一个网站,500访问一个网站,可能会两个网站都建议抓,总之如果网站超过6000+,需要不断同步抓取。
那么用ip访问就有问题,因为你可能从ip不断发出的请求,目前规定是不能超过10000端口,否则adsl可能会过于繁忙,导致无法抓取。下面的抓取到页面内容部分讲解了ip的问题。以及,一定要提前分析你的网站,一个页面有多个header信息。注意:注意:注意:你的目标是web相关网站,所以想正则应该是要做正则匹配(如果不做正则匹配,curl命令在找页面时会无法被识别,只能从index_inurl的第一个字符开始搜),以及(搜索结果会由于ip过多,一些指定ip无法正确检索页面,可能会使用段代码)。
2.所有想要抓取的新闻页面的header参数有了,就可以进行爬取了(爬取前先看看你想抓取的页面:):请求速度,可以按抓取新闻页面前5个域名网址的速度进行筛选:page数/search_type数/page是不是4000/5000/10000!!!差5毫秒的就返回4050/2040/13000,差2毫秒的返回3050/2590/26000,好奇怪为什么,就为了截图么?为了避免重复遍历,请先看看新闻页面的结构。
解决方案:知乎回答一般是ajax加载页面,因此页面采用getpost,而后端可以采用post,可以传参数,也可以不传。爬虫抓取代码如下:processing.content.stop()//不会停止输出processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.split('[\w\w]')//把输出的内容切成小段processing.content.strip()//开始弹出全屏画面processing。
python抓取动态网页(如何车托之家评论?如何学习python基础语法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-12-05 16:16
python抓取动态网页:1.学习python基础语法2.web爬虫,这里用的是django3.实战,爬取汽车之家汽车评论4.网络爬虫5.数据可视化初步,
如果要写爬虫应该先学会http协议基础的不懂你的流程下载就是按网站协议去请求开始这边代码python第三方包:python如何抓取车托之家评论?一,第三方包下载,xpath,json,xpath(urllib2,requests,beautifulsoup,fs等)这些地方可以上网找相关资料,首先必须掌握了这些知识。
二,然后就是python里各种第三方包。这个可以单独下这个库,在time里面是抓包获取http方面的包,可以多练练,掌握下效率。然后就是模块了,这个推荐大家查清楚,在lxml,beautifulsoup里面定一个模块来做页面请求(不好代码,基本上就是构造请求,headers参数,返回html结构以及json格式)第三方库,这个就多了,xpath,scrapy就是按照标准库来抓取内容就行。
这个作为爬虫基础,有json这块的(xpath,json,selenium,pandas等,简单介绍下json)就好。需要搞懂xpath和python的第三方包,基本上爬取就已经没问题了。三,数据获取,通过有道等其他的搜索引擎可以下载到数据。总之就是一个爬虫入门的问题,这里就不再多说。顺便补充下爬虫方面的知识,可以参考下:大量数据抓取,大数据与人工智能爬虫方面的知识学习网。 查看全部
python抓取动态网页(如何车托之家评论?如何学习python基础语法)
python抓取动态网页:1.学习python基础语法2.web爬虫,这里用的是django3.实战,爬取汽车之家汽车评论4.网络爬虫5.数据可视化初步,
如果要写爬虫应该先学会http协议基础的不懂你的流程下载就是按网站协议去请求开始这边代码python第三方包:python如何抓取车托之家评论?一,第三方包下载,xpath,json,xpath(urllib2,requests,beautifulsoup,fs等)这些地方可以上网找相关资料,首先必须掌握了这些知识。
二,然后就是python里各种第三方包。这个可以单独下这个库,在time里面是抓包获取http方面的包,可以多练练,掌握下效率。然后就是模块了,这个推荐大家查清楚,在lxml,beautifulsoup里面定一个模块来做页面请求(不好代码,基本上就是构造请求,headers参数,返回html结构以及json格式)第三方库,这个就多了,xpath,scrapy就是按照标准库来抓取内容就行。
这个作为爬虫基础,有json这块的(xpath,json,selenium,pandas等,简单介绍下json)就好。需要搞懂xpath和python的第三方包,基本上爬取就已经没问题了。三,数据获取,通过有道等其他的搜索引擎可以下载到数据。总之就是一个爬虫入门的问题,这里就不再多说。顺便补充下爬虫方面的知识,可以参考下:大量数据抓取,大数据与人工智能爬虫方面的知识学习网。
python抓取动态网页(爬取js动态生成的页面是获取不到内容的源代码 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2021-12-05 06:17
)
抓取js动态生成的页面时,直接打开页面无法获取内容。比如我在抓取百度手机助手应用的时候就遇到了这样的问题。搜索旅游应用的时候,返回的数据有好几页内容,但是无论翻到哪一页,查看源码都可以找到,也就是第一页的源码。分析原因,我认为可能是这样的:假设百度应用的一个页面上有八个应用。你提交查询之后,他从内容的前八页生成一个html,然后你翻页的时候,替换成js,ajax等,原来的8个应用,比如你选择第五页的时候,用返回到应用程序列表的 33-40 个应用程序替换原来的 1-8 个应用程序。(应该是ajax或者其他更可能的表单提交方式,因为纯js不涉及表单提交等后端交互,第一次查询时所有结果都需要返回并存储在前端)【个人分析,请指正】
文章 想法参考来自:感谢原作者
好了,既然我们的目标已经明确了,那就找到对应的表达式提交(或js)动作。这里我们使用谷歌的开发者工具。我们接下来的操作是在谷歌浏览器中进行的。
让我们从头开始:
1、打开手机助手搜索“旅行”,网址:travel
我们得到了一个搜索结果:搜索到你:461旅游申请结果
这时候就可以查看源文件了。
2、 翻页url:旅游#page2发现源文件还是一样,这是动态加载造成的,那后面的界面怎么把握呢?
3、打开谷歌开发者工具:
此时没有内容,需要加载一次页面:url:%E6%97%85%E6%B8%B8#page2
在保留开发者工具如上图的前提下,在地址栏中输入你要解析的页面的URL(如上面的URL),然后就可以看到内容了:
里面的东西很多,我们需要一一看,但是你会发现,真正有价值的东西并不多。我们终于找到了这个:
这里的app名称就是我们想要爬取到第二页的app名称,这也是我们最终想要的。
4、 右击左边红框,可以复制链接:%E6%97%85%E6%B8%B8&page=1&_=09
打开这个链接后,我们发现这个网页的源码就是我们想要的(其实就是表单提交)。不是很好吗?
5、 但这还不够。我们想要的是一个通用的方法。提交此表单后如何构造数字?直接删除就行了,就是%E6%97%85%打开E6%B8%B8&page=1后,效果是一样的。如果一些网站有影响,你可以找到更多的模式。
6、 根据我们目前的信息,总结规则:
页码
#关于页码,需要说明一下,如果是第n页,填写页码n-1,第一页为0
7、 可能出现乱码,需要修改chrome编码为utf8
这个爬虫的python源代码:
#encoding:utf8
# @Author lvpengbin
'''
爬取百度手机助手app_name示例代码,以爬取搜索关键字“旅游”返回结果的第二页为例 url:http://shouji.baidu.com/s?wd=旅游#page2
'''
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import urllib2
from bs4 import BeautifulSoup
url='http://shouji.baidu.com/s%3Fda ... 39%3B
req_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',
'Accept':'*/*',
'Accept-Language':'zh-CN,zh;q=0.8',
'Connection':'close',
'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host
}#这里需要设置header,要不然系统默认的Accept-Language是英语,返回的页面是英文的
req_timeout = 5
req = urllib2.Request(url,None,req_header)
resp = urllib2.urlopen(req,None,req_timeout)
html = resp.read()
soup = BeautifulSoup(html)
nodes = soup.find_all("a",onclick="bd_app_dl(this,event);")
for node in nodes:
print node['data_name']
'''
输出:
优步 - Uber
蚂蜂窝自由行
飞常准
TripAdvisor
和生活
易到用车
爱城市
智行火车票-12306购票
TripAdvisor
淘在路上旅游
''' 查看全部
python抓取动态网页(爬取js动态生成的页面是获取不到内容的源代码
)
抓取js动态生成的页面时,直接打开页面无法获取内容。比如我在抓取百度手机助手应用的时候就遇到了这样的问题。搜索旅游应用的时候,返回的数据有好几页内容,但是无论翻到哪一页,查看源码都可以找到,也就是第一页的源码。分析原因,我认为可能是这样的:假设百度应用的一个页面上有八个应用。你提交查询之后,他从内容的前八页生成一个html,然后你翻页的时候,替换成js,ajax等,原来的8个应用,比如你选择第五页的时候,用返回到应用程序列表的 33-40 个应用程序替换原来的 1-8 个应用程序。(应该是ajax或者其他更可能的表单提交方式,因为纯js不涉及表单提交等后端交互,第一次查询时所有结果都需要返回并存储在前端)【个人分析,请指正】
文章 想法参考来自:感谢原作者
好了,既然我们的目标已经明确了,那就找到对应的表达式提交(或js)动作。这里我们使用谷歌的开发者工具。我们接下来的操作是在谷歌浏览器中进行的。
让我们从头开始:
1、打开手机助手搜索“旅行”,网址:travel
我们得到了一个搜索结果:搜索到你:461旅游申请结果
这时候就可以查看源文件了。
2、 翻页url:旅游#page2发现源文件还是一样,这是动态加载造成的,那后面的界面怎么把握呢?
3、打开谷歌开发者工具:
此时没有内容,需要加载一次页面:url:%E6%97%85%E6%B8%B8#page2
在保留开发者工具如上图的前提下,在地址栏中输入你要解析的页面的URL(如上面的URL),然后就可以看到内容了:
里面的东西很多,我们需要一一看,但是你会发现,真正有价值的东西并不多。我们终于找到了这个:
这里的app名称就是我们想要爬取到第二页的app名称,这也是我们最终想要的。
4、 右击左边红框,可以复制链接:%E6%97%85%E6%B8%B8&page=1&_=09
打开这个链接后,我们发现这个网页的源码就是我们想要的(其实就是表单提交)。不是很好吗?
5、 但这还不够。我们想要的是一个通用的方法。提交此表单后如何构造数字?直接删除就行了,就是%E6%97%85%打开E6%B8%B8&page=1后,效果是一样的。如果一些网站有影响,你可以找到更多的模式。
6、 根据我们目前的信息,总结规则:
页码
#关于页码,需要说明一下,如果是第n页,填写页码n-1,第一页为0
7、 可能出现乱码,需要修改chrome编码为utf8
这个爬虫的python源代码:
#encoding:utf8
# @Author lvpengbin
'''
爬取百度手机助手app_name示例代码,以爬取搜索关键字“旅游”返回结果的第二页为例 url:http://shouji.baidu.com/s?wd=旅游#page2
'''
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import urllib2
from bs4 import BeautifulSoup
url='http://shouji.baidu.com/s%3Fda ... 39%3B
req_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',
'Accept':'*/*',
'Accept-Language':'zh-CN,zh;q=0.8',
'Connection':'close',
'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host
}#这里需要设置header,要不然系统默认的Accept-Language是英语,返回的页面是英文的
req_timeout = 5
req = urllib2.Request(url,None,req_header)
resp = urllib2.urlopen(req,None,req_timeout)
html = resp.read()
soup = BeautifulSoup(html)
nodes = soup.find_all("a",onclick="bd_app_dl(this,event);")
for node in nodes:
print node['data_name']
'''
输出:
优步 - Uber
蚂蜂窝自由行
飞常准
TripAdvisor
和生活
易到用车
爱城市
智行火车票-12306购票
TripAdvisor
淘在路上旅游
'''
python抓取动态网页(需安装的三方库示例代码示例说明:获取德邦官网)
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-12-04 18:24
前言
在抓取一个普通的静态网页时,我们可以直接请求相应的URL来获取完整的HTML页面,但是对于动态页面来说,网页显示的内容往往是通过ajax动态生成的,所以如果直接使用urllib.request的时候获取页面的HTML,就无法获取到我们想要的内容。然后我们就可以使用selenium库来获取我们需要的内容了。
需要安装的三方库示例代码
示例说明:获取德邦官网开设网点所在的城市区域名称
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless") #设置该参数使在获取网页时不打开浏览器
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path="./chromedriver")
driver.get("https://www.deppon.com/deptlist/")
html = driver.page_source
driver.close()
soup = BeautifulSoup(html, 'lxml')
items = soup.select('div[class~="listA_Z"] a')
for item in items:
print(item.string)
遇到的小问题用“pip install selenium”安装selenium库失败。您可以使用以下命令安装“pip install --trusted-host --trusted-host selenium”。使用webdriver.Chrome()时,出现问题。我在网上看到的文章用的是火狐浏览器。他们可以直接使用 webdriver.Firefox(),但我使用 Google Chrome。我以为使用谷歌浏览器和使用火狐是一样的,但是在运行时发生了错误。后来我在网上找到了。我想从 selenium 官网下载 Chrom Driver。然后,当使用 webdriver.chorme() 函数时,我需要上传它。executable_path参数,该参数的值为selenium官网下载的Chrome Driver.exe文件所在的路径。在示例中,我把chromedriver.exe放在根目录下,所以在代码中使用了相对路径(executable_path="./chromedriver")。推荐
Chrom/firefox浏览器插件:Katalon Recorder,Katalon Recorder是一个前端自动化测试插件,可以用来记录你在网页上的所有操作,最神奇的是它还可以导出记录到各种代码,其中收录 Python2 代码。有时候借用它,我们甚至可以不用分析HTML的结构就可以很容易的得到我们需要的数据,这对于HTML结构凌乱的网页非常有帮助。 查看全部
python抓取动态网页(需安装的三方库示例代码示例说明:获取德邦官网)
前言
在抓取一个普通的静态网页时,我们可以直接请求相应的URL来获取完整的HTML页面,但是对于动态页面来说,网页显示的内容往往是通过ajax动态生成的,所以如果直接使用urllib.request的时候获取页面的HTML,就无法获取到我们想要的内容。然后我们就可以使用selenium库来获取我们需要的内容了。
需要安装的三方库示例代码
示例说明:获取德邦官网开设网点所在的城市区域名称
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless") #设置该参数使在获取网页时不打开浏览器
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path="./chromedriver")
driver.get("https://www.deppon.com/deptlist/")
html = driver.page_source
driver.close()
soup = BeautifulSoup(html, 'lxml')
items = soup.select('div[class~="listA_Z"] a')
for item in items:
print(item.string)
遇到的小问题用“pip install selenium”安装selenium库失败。您可以使用以下命令安装“pip install --trusted-host --trusted-host selenium”。使用webdriver.Chrome()时,出现问题。我在网上看到的文章用的是火狐浏览器。他们可以直接使用 webdriver.Firefox(),但我使用 Google Chrome。我以为使用谷歌浏览器和使用火狐是一样的,但是在运行时发生了错误。后来我在网上找到了。我想从 selenium 官网下载 Chrom Driver。然后,当使用 webdriver.chorme() 函数时,我需要上传它。executable_path参数,该参数的值为selenium官网下载的Chrome Driver.exe文件所在的路径。在示例中,我把chromedriver.exe放在根目录下,所以在代码中使用了相对路径(executable_path="./chromedriver")。推荐
Chrom/firefox浏览器插件:Katalon Recorder,Katalon Recorder是一个前端自动化测试插件,可以用来记录你在网页上的所有操作,最神奇的是它还可以导出记录到各种代码,其中收录 Python2 代码。有时候借用它,我们甚至可以不用分析HTML的结构就可以很容易的得到我们需要的数据,这对于HTML结构凌乱的网页非常有帮助。
python抓取动态网页( 如何利用Python爬取模块获取查看器的html内容(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2021-12-04 18:19
如何利用Python爬取模块获取查看器的html内容(图))
1. 文章 目的
我们在使用Python抓取网页数据时,经常会用到urllib模块,通过调用urllib模块的urlopen(url)方法返回网页。
页面对象,使用read()方法获取url的html内容,然后使用BeautifulSoup抓取某个标签的内容,结合正则表
亲爱的过滤器。然而,你用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容,还有很多动态数据(比如 网站
访问量、当前在线人数、微博点赞数等)不收录在静态html中,比如我要抢这个bbs网
当前点击打开网站各版块链接的在线人数不收录在静态html网页中(如果不信,请尝试查看页面的源代码,
只有一条简单的线)。这些动态数据大部分是由JavaScript、JQuery、PHP等语言动态生成的,因此,
不宜使用爬取静态html内容的方法。
2. 解决方案
我试过网上提到的浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具),上网查了一下
动态数据的趋势是可以得到的,但是这需要从众多的URL中寻找线索,我个人觉得太麻烦了。另外,使用查看器
查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何查看
html变成python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
并且无意中找到了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,并找到当前se
ssion 对应的标签。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一个
一些重要的动态数据。其实selenium模块的功能不限于抓取网页,它是网络自动化测试的常用模块
,在Ruby和Java中被广泛使用。Python虽然使用的比较少,但它也是一个非常简洁、高效、易用的工具。
手的自动化测试模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,还可以
可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
3. 实施过程
3.1 运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有self
用selenium,如果直接在Python程序中导入selenium,会提示没有这个模块。联网状态下,cmd直接进入pip i
安装selenium,系统会找到Python安装目录直接下载、解压安装这个模块。等到终端提示完成
看看C:\Python27\Lib\site-packages目录下有没有selenium模块,这个目录取决于你安装的Python
的路径。如果有两个文件夹,selenium和selenium-2.47.3.dist-info,可以在Python程序中添加模块
已加载。
使用 webdriver 捕获动态数据
先导入webdriver子模块
从硒导入网络驱动程序
获取浏览器会话,可以使用火狐、Chrome、IE等浏览器,这里以火狐为例
浏览器 = webdriver.Firefox()
加载页面,只需在url中指定一个有效的字符串
browser.get(url)
获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
姓名
班级名称
关联
文本
部分的
关联
文本
标签
姓名
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考selenium webdriver(python)教程第三章-定位方法(第一版可百度
学位图书馆阅读)
结合正则表达式过滤相关信息
定位后的一些元素是不可取的,使用常规过滤即可。比如我想只提取英文字符(包括0-9),创建如下
常规的
pa=堆(r'\w+')
对于 lis 中的你:
en=pa.findall(u.lis)
印刷英文
关闭会话
执行fetch操作后必须关闭session,否则让它一直占用内存会影响机器上其他进程的操作
Browser.close() 或 browser.quit() 可以关闭会话,前者只是关闭当前会话,浏览器的webdrive
r 没有关闭,后者是关闭包括webdriver在内的所有东西
添加异常处理
这是必须的,因为有时候会获取session失败,所以把上面的语句块放到try里面,然后用exception处理
除了 NoSuchElementException:
断言 0,“找不到元素”
4. 代码实现
我通过点击打开链接抓取了指定分区中每个分区的在线用户数,并指定分区id号(0-9),可以得到分区名和对
在线用户数应该打印在一个列表中,代码如下
[python] 查看平原
# -*- 编码:utf-8 -*-
从硒导入网络驱动程序
从 mon.exceptions 导入 NoSuchElementException
导入时间
进口重新
def find_sec(secid):
pa=堆(r'\w+')
browser = webdriver.Firefox() # 获取firefox的本地会话
browser.get("!section/%s "%secid) # 加载页面
time.sleep(1) # 让页面加载
结果=[]
尝试:
#获取页面名称和在线号码组成列表
board=browser.find_elements_by_class_name('title_1')
ol_num=browser.find_elements_by_class_name('title_4')
max_bindex=len(板)
max_oindex=len(ol_num)
assert max_bindex==max_oindex,'索引不等价!'
#页面名称为中英文,所以常规过滤后只剩下英文
对于范围内的 i (1,max_oindex):
board_en=pa.findall(board.text)
result.append([str(board_en[-1]),int(ol_num.text)])
浏览器关闭()
返回结果
除了 NoSuchElementException:
断言 0,“找不到元素”
print find_sec('5')#打印第5分区下所有版块的当前在线用户列表
运行结果如下:
终端打印效果
4. 总结
Selenium 在代码简洁性和执行效率方面非常出色。使用 selenium webdriver 捕获动态数据不是
它通常简单而有效。也可以进一步利用这个来实现数据挖掘、机器学习等深度研究,所以selenium+pyth
就值得深入研究!如果觉得每次都用selenium打开浏览器不方便,可以用phantomjs模拟一个虚拟的
浏览器出来了,这里就不赘述了。 查看全部
python抓取动态网页(
如何利用Python爬取模块获取查看器的html内容(图))

1. 文章 目的
我们在使用Python抓取网页数据时,经常会用到urllib模块,通过调用urllib模块的urlopen(url)方法返回网页。
页面对象,使用read()方法获取url的html内容,然后使用BeautifulSoup抓取某个标签的内容,结合正则表
亲爱的过滤器。然而,你用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容,还有很多动态数据(比如 网站
访问量、当前在线人数、微博点赞数等)不收录在静态html中,比如我要抢这个bbs网
当前点击打开网站各版块链接的在线人数不收录在静态html网页中(如果不信,请尝试查看页面的源代码,
只有一条简单的线)。这些动态数据大部分是由JavaScript、JQuery、PHP等语言动态生成的,因此,
不宜使用爬取静态html内容的方法。
2. 解决方案
我试过网上提到的浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具),上网查了一下
动态数据的趋势是可以得到的,但是这需要从众多的URL中寻找线索,我个人觉得太麻烦了。另外,使用查看器
查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何查看
html变成python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。
并且无意中找到了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,并找到当前se
ssion 对应的标签。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一个
一些重要的动态数据。其实selenium模块的功能不限于抓取网页,它是网络自动化测试的常用模块
,在Ruby和Java中被广泛使用。Python虽然使用的比较少,但它也是一个非常简洁、高效、易用的工具。
手的自动化测试模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,还可以
可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。
3. 实施过程
3.1 运行环境
我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有self
用selenium,如果直接在Python程序中导入selenium,会提示没有这个模块。联网状态下,cmd直接进入pip i
安装selenium,系统会找到Python安装目录直接下载、解压安装这个模块。等到终端提示完成
看看C:\Python27\Lib\site-packages目录下有没有selenium模块,这个目录取决于你安装的Python
的路径。如果有两个文件夹,selenium和selenium-2.47.3.dist-info,可以在Python程序中添加模块
已加载。
使用 webdriver 捕获动态数据
先导入webdriver子模块
从硒导入网络驱动程序
获取浏览器会话,可以使用火狐、Chrome、IE等浏览器,这里以火狐为例
浏览器 = webdriver.Firefox()
加载页面,只需在url中指定一个有效的字符串
browser.get(url)
获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:
ID
姓名
班级名称
关联
文本
部分的
关联
文本
标签
姓名
路径
css选择器
比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')
按类名定位,lis=find_elements_by_class_name('title_1')
更详细的定位方法请参考selenium webdriver(python)教程第三章-定位方法(第一版可百度
学位图书馆阅读)
结合正则表达式过滤相关信息
定位后的一些元素是不可取的,使用常规过滤即可。比如我想只提取英文字符(包括0-9),创建如下
常规的
pa=堆(r'\w+')
对于 lis 中的你:
en=pa.findall(u.lis)
印刷英文
关闭会话
执行fetch操作后必须关闭session,否则让它一直占用内存会影响机器上其他进程的操作
Browser.close() 或 browser.quit() 可以关闭会话,前者只是关闭当前会话,浏览器的webdrive
r 没有关闭,后者是关闭包括webdriver在内的所有东西
添加异常处理
这是必须的,因为有时候会获取session失败,所以把上面的语句块放到try里面,然后用exception处理
除了 NoSuchElementException:
断言 0,“找不到元素”
4. 代码实现
我通过点击打开链接抓取了指定分区中每个分区的在线用户数,并指定分区id号(0-9),可以得到分区名和对
在线用户数应该打印在一个列表中,代码如下
[python] 查看平原
# -*- 编码:utf-8 -*-
从硒导入网络驱动程序
从 mon.exceptions 导入 NoSuchElementException
导入时间
进口重新
def find_sec(secid):
pa=堆(r'\w+')
browser = webdriver.Firefox() # 获取firefox的本地会话
browser.get("!section/%s "%secid) # 加载页面
time.sleep(1) # 让页面加载
结果=[]
尝试:
#获取页面名称和在线号码组成列表
board=browser.find_elements_by_class_name('title_1')
ol_num=browser.find_elements_by_class_name('title_4')
max_bindex=len(板)
max_oindex=len(ol_num)
assert max_bindex==max_oindex,'索引不等价!'
#页面名称为中英文,所以常规过滤后只剩下英文
对于范围内的 i (1,max_oindex):
board_en=pa.findall(board.text)
result.append([str(board_en[-1]),int(ol_num.text)])
浏览器关闭()
返回结果
除了 NoSuchElementException:
断言 0,“找不到元素”
print find_sec('5')#打印第5分区下所有版块的当前在线用户列表
运行结果如下:
终端打印效果
4. 总结
Selenium 在代码简洁性和执行效率方面非常出色。使用 selenium webdriver 捕获动态数据不是
它通常简单而有效。也可以进一步利用这个来实现数据挖掘、机器学习等深度研究,所以selenium+pyth
就值得深入研究!如果觉得每次都用selenium打开浏览器不方便,可以用phantomjs模拟一个虚拟的
浏览器出来了,这里就不赘述了。
python抓取动态网页(excel中3.算法的性能,需要找到需求的文件进行排除)
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-03 18:32
需求场景:需要找到收录源代码中指定的客户信息的某些字段。
版本 1:检索关键字,如果收录,则将其输出到控制台。
import os
rootDir = os.getcwd()
def scan_file(filename, dirname):
if("hello" in filename):
if("src" in dirname):
print(os.path.join(dirname,filename))
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
#print(l)
if("hello" in l):
if("/src" in dirname):
print(os.path.join(dirname,filename))
break
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
scan_file(fname, dirName)
版本2:检索多个关键字,输出收录关键字和收录的关键字的文件
rootDir = os.getcwd()
keywords = ["hello","world","thanks"]
def scan_file(filename, dirname,keyword):
if(keyword in filename):
if("/src" in dirname):
return True
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
if(keyword in l):
if("/src" in dirname):
return True
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
flag = False
for keyword in keywords:
if(scan_file(fname, dirName,keyword)):
if(flag is False):
flag = True
f = open('test.txt', 'a')
f.write(keyword)
f.write(" ,")
f.close()
if(flag is True):
f = open('test.txt', 'a')
f.write("\n"+os.path.join(dirName,fname)+"\n")
f.close()
这个版本实现了基本功能,但还不够完善。迭代空间:
1.算法的性能,包括代码的时间复杂度、冗余度和优雅度
2.输出结果的可读性,最好按照模块组织文件,并在excel中呈现
3.详情:排除不符合要求的文件,如png。
留给读者思考。 查看全部
python抓取动态网页(excel中3.算法的性能,需要找到需求的文件进行排除)
需求场景:需要找到收录源代码中指定的客户信息的某些字段。
版本 1:检索关键字,如果收录,则将其输出到控制台。
import os
rootDir = os.getcwd()
def scan_file(filename, dirname):
if("hello" in filename):
if("src" in dirname):
print(os.path.join(dirname,filename))
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
#print(l)
if("hello" in l):
if("/src" in dirname):
print(os.path.join(dirname,filename))
break
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
scan_file(fname, dirName)
版本2:检索多个关键字,输出收录关键字和收录的关键字的文件
rootDir = os.getcwd()
keywords = ["hello","world","thanks"]
def scan_file(filename, dirname,keyword):
if(keyword in filename):
if("/src" in dirname):
return True
else:
with open(os.path.join(dirname,filename)) as f:
lines = f.readlines()
for l in lines:
if(keyword in l):
if("/src" in dirname):
return True
for dirName, subdirList, fileList in os.walk(rootDir):
for fname in fileList:
flag = False
for keyword in keywords:
if(scan_file(fname, dirName,keyword)):
if(flag is False):
flag = True
f = open('test.txt', 'a')
f.write(keyword)
f.write(" ,")
f.close()
if(flag is True):
f = open('test.txt', 'a')
f.write("\n"+os.path.join(dirName,fname)+"\n")
f.close()
这个版本实现了基本功能,但还不够完善。迭代空间:
1.算法的性能,包括代码的时间复杂度、冗余度和优雅度
2.输出结果的可读性,最好按照模块组织文件,并在excel中呈现
3.详情:排除不符合要求的文件,如png。
留给读者思考。
python抓取动态网页(web页面使用ajax技术动态加载页面的解决办法内存开销 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2021-12-03 15:00
)
现在很多网页都使用ajax技术来动态加载页面。但是对于爬虫来说,目标数据可能不在页面的HTML源代码中(右键查看网页源代码,F12搜索),静态页面的爬虫已经不能满足当前的需求.
很多教程推荐结合使用Selenium和PhantomJS来渲染网页,获取网页的所有信息。但是对于爬虫程序来说,模拟浏览器的内存开销很大,效率很低。
好消息是,大部分浏览器在请求解析完 HTML 后,会根据 js 的“指令”发送另一个请求,获取页面显示的内容,然后通过 js 渲染后显示到界面上。这类请求的内容往往是json格式,这样既不会加重爬虫任务,反而可以省去解析HTML的工作量。
本文以抓取某位名人在Instagram上传的所有图片为例,讲解动态加载页面的解决方案。文末附上所有代码
工具:铬
包:json、请求、urllib
分析ins页面
一个用户的主页
打开一个用户ins的首页(),可以看到首页只加载了12张图片,点击“更多”会加载更多图片。我们先来获取这12张图片的网址。
获取前12张图片的URL
首先检查源代码中是否存在图片的URL。在脚本标签中找到了前 12 张图片的 URL。
网页源代码
有了这个发现,我们可以提取到首页的12个图片网址!!
代码显示如下:
通过使用lxml库实现解析,不懂lxml的小朋友可以去崔大神的博客学习。
获取更多图片的网址
当我单击“更多”按钮时,我发现 XHR 选项卡中加载了一些新文件。
加载前
加载后
每次页面下拉,加载12张图片,“?query_idbalabala”文件也会加1个!
单击文件可查看详细信息。发现文件返回的是json数据,数据中收录了我们想要的图片网址!!
返回的json数据
所以只要拿到这些json数据,就可以提取出更多的图片网址。
索取资料
索取资料
索取资料
仔细查看上图中的Request URL,让我们分析一下它的请求参数(包括query_id、id、first、after),可以看到后续加载的query_id为“059182”,“id”为你访问的用户的用户id,即“1161353543”,“first”是一次加载的图片数量,总是12,“after”比较复杂。但是按照常识,这个参数应该在之前的文件中可以找到。
找到“之后”
使用ctrl+F查找页面源码中after参数对应的值。脚本标签中也是一样,只是对应的键名是“end_cursor”
采集了四个请求参数,现在我们可以构造Request URL,通过解析返回的json数据获取更多的图片URL
代码显示如下:
src_list中保存了用户590张图片的URL,现在是时候进入下载链接了~
下载图片
博主懒得换代理,直接用最简单粗暴的方式下载图片。
结果显示~
所有代码
# -*- coding: utf-8 -*-
import json
import requests
from lxml import etree
from urllib import parse
BASE_URL = "https://www.instagram.com/urnotchrislee/"
headers = {
"Origin": "https://www.instagram.com/",
"Referer": "https://www.instagram.com/urnotchrislee/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",
"Host": "www.instagram.com"}
def load_rest(table,has_next_page):
rest = []
while has_next_page:
text = json.dumps(table)
URL = 'https://www.instagram.com/grap ... quote(text)
res = requests.get(URL,headers = headers)
dic = json.loads(res.content.decode(),encoding='utf-8')
data = dic['data']['user']['edge_owner_to_timeline_media']
nodes = data['edges']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
for node in nodes:
rest.append(node['node']['display_url'])
#print(node['node']['display_url'])
table['after'] = end_cursor
print('加载..')
print('加载完成')
return rest
if __name__=='__main__':
res = requests.get(BASE_URL,headers = headers)
html = etree.HTML(res.content.decode())
# h = html.xpath('''//script[@type="text/javascript"]/text()''')[1].replace('window._sharedData =','').strip()
h = html.xpath('''//script[@type="text/javascript"]''')[1].text.replace('window._sharedData = ','').strip()[:-1]
dic = json.loads(h,encoding='utf-8')
data = dic['entry_data']['ProfilePage'][0]['user']['media']
nodes = data['nodes']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
lee_id = nodes[0]["owner"]["id"] #'1161353543'
src_list = []
for node in nodes:
src_list.append(node['display_src'])
print(node['display_src'])
print('加载')
table = {
'id':lee_id,
'first':12,
'after':end_cursor}
rest = load_rest(table,has_next_page)
src_list = src_list + rest
print(len(src_list))
# with open('abc', 'w') as f:
# for s in src_list:
# f.write(s)
# f.write('\n')
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",}
for i in range(len(src_list)):
url = src_list[i].strip()
res = requests.get(url,headers = headers)
with open('第'+str(i+1)+'张.jpg','wb') as ff:
ff.write(res.content)
参考页面:
网络爬虫用Python-04.另一种爬虫方法
Python 的 Instagram 图片爬虫 (一)
Python 的 Instagram 图片爬虫 (二)
新手小白,逻辑混乱,欢迎大佬指正,请吐槽
查看全部
python抓取动态网页(web页面使用ajax技术动态加载页面的解决办法内存开销
)
现在很多网页都使用ajax技术来动态加载页面。但是对于爬虫来说,目标数据可能不在页面的HTML源代码中(右键查看网页源代码,F12搜索),静态页面的爬虫已经不能满足当前的需求.
很多教程推荐结合使用Selenium和PhantomJS来渲染网页,获取网页的所有信息。但是对于爬虫程序来说,模拟浏览器的内存开销很大,效率很低。
好消息是,大部分浏览器在请求解析完 HTML 后,会根据 js 的“指令”发送另一个请求,获取页面显示的内容,然后通过 js 渲染后显示到界面上。这类请求的内容往往是json格式,这样既不会加重爬虫任务,反而可以省去解析HTML的工作量。
本文以抓取某位名人在Instagram上传的所有图片为例,讲解动态加载页面的解决方案。文末附上所有代码

工具:铬
包:json、请求、urllib
分析ins页面

一个用户的主页
打开一个用户ins的首页(),可以看到首页只加载了12张图片,点击“更多”会加载更多图片。我们先来获取这12张图片的网址。
获取前12张图片的URL
首先检查源代码中是否存在图片的URL。在脚本标签中找到了前 12 张图片的 URL。

网页源代码
有了这个发现,我们可以提取到首页的12个图片网址!!
代码显示如下:


通过使用lxml库实现解析,不懂lxml的小朋友可以去崔大神的博客学习。
获取更多图片的网址
当我单击“更多”按钮时,我发现 XHR 选项卡中加载了一些新文件。

加载前

加载后
每次页面下拉,加载12张图片,“?query_idbalabala”文件也会加1个!

单击文件可查看详细信息。发现文件返回的是json数据,数据中收录了我们想要的图片网址!!

返回的json数据
所以只要拿到这些json数据,就可以提取出更多的图片网址。

索取资料

索取资料

索取资料
仔细查看上图中的Request URL,让我们分析一下它的请求参数(包括query_id、id、first、after),可以看到后续加载的query_id为“059182”,“id”为你访问的用户的用户id,即“1161353543”,“first”是一次加载的图片数量,总是12,“after”比较复杂。但是按照常识,这个参数应该在之前的文件中可以找到。
找到“之后”
使用ctrl+F查找页面源码中after参数对应的值。脚本标签中也是一样,只是对应的键名是“end_cursor”

采集了四个请求参数,现在我们可以构造Request URL,通过解析返回的json数据获取更多的图片URL

代码显示如下:

src_list中保存了用户590张图片的URL,现在是时候进入下载链接了~
下载图片
博主懒得换代理,直接用最简单粗暴的方式下载图片。

结果显示~

所有代码
# -*- coding: utf-8 -*-
import json
import requests
from lxml import etree
from urllib import parse
BASE_URL = "https://www.instagram.com/urnotchrislee/"
headers = {
"Origin": "https://www.instagram.com/",
"Referer": "https://www.instagram.com/urnotchrislee/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",
"Host": "www.instagram.com"}
def load_rest(table,has_next_page):
rest = []
while has_next_page:
text = json.dumps(table)
URL = 'https://www.instagram.com/grap ... quote(text)
res = requests.get(URL,headers = headers)
dic = json.loads(res.content.decode(),encoding='utf-8')
data = dic['data']['user']['edge_owner_to_timeline_media']
nodes = data['edges']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
for node in nodes:
rest.append(node['node']['display_url'])
#print(node['node']['display_url'])
table['after'] = end_cursor
print('加载..')
print('加载完成')
return rest
if __name__=='__main__':
res = requests.get(BASE_URL,headers = headers)
html = etree.HTML(res.content.decode())
# h = html.xpath('''//script[@type="text/javascript"]/text()''')[1].replace('window._sharedData =','').strip()
h = html.xpath('''//script[@type="text/javascript"]''')[1].text.replace('window._sharedData = ','').strip()[:-1]
dic = json.loads(h,encoding='utf-8')
data = dic['entry_data']['ProfilePage'][0]['user']['media']
nodes = data['nodes']
end_cursor = data['page_info']['end_cursor']
has_next_page = data['page_info']['has_next_page']
lee_id = nodes[0]["owner"]["id"] #'1161353543'
src_list = []
for node in nodes:
src_list.append(node['display_src'])
print(node['display_src'])
print('加载')
table = {
'id':lee_id,
'first':12,
'after':end_cursor}
rest = load_rest(table,has_next_page)
src_list = src_list + rest
print(len(src_list))
# with open('abc', 'w') as f:
# for s in src_list:
# f.write(s)
# f.write('\n')
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.36",}
for i in range(len(src_list)):
url = src_list[i].strip()
res = requests.get(url,headers = headers)
with open('第'+str(i+1)+'张.jpg','wb') as ff:
ff.write(res.content)
参考页面:
网络爬虫用Python-04.另一种爬虫方法
Python 的 Instagram 图片爬虫 (一)
Python 的 Instagram 图片爬虫 (二)
新手小白,逻辑混乱,欢迎大佬指正,请吐槽

python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-12-03 11:01
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:
可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:
然后直接点一个进去,复制url(右键复制链接地址)看看是什么:
原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l 查看全部
python抓取动态网页(记录一下爬取动态网页的步骤-实例讲解东方财富网获取股票列表
)
笔者在做爬虫工作时遇到了动态网页,所以在分析代码网页的源代码时,缺少了很多需要的元素。下面通过一个例子来记录爬取动态网页的步骤。
示例:股票定向爬虫
本例的目标是从东方财富网获取一个股票列表,然后根据该股票列表从百度股票中一一获取个股信息,最后将结果存入文件。基本上,我看到的代码就是上面三个步骤。
踩雷
一开始没发现是动态网页,因为我直接在需要的信息上点右键查看信息,发现信息还是挺全的,不过代码会有点变化,我当时没发现什么问题(没有这次实战经验还是太恶毒了)。一种操作如图所示:

可以看到,需要信息的网页代码仍然存在,但是当你展开td标签时,网页会自动恢复,标签里面的信息也会自动收回,所以我认为这是一个动态网页,并且所有信息都是动态加载的。,而不是静态渲染。右键查看源码,可以发现源码中并没有这样的信息,说明确实是一个动态网页:
想办法
由于它是动态加载的,数据文件仍然存在。因此,我检查了资源文件中是否有任何所需的数据文件。结果我一一点击,找到了目标:

然后直接点一个进去,复制url(右键复制链接地址)看看是什么:

原来首页所有的股票信息都在这个文件里,太好了,这个url就是我们爬取的对象url。
代码
def getHTMLText(url, code='utf-8'):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = code
return r.text
except:
return ""
<p># 东方财富网,通过a标签内找到股票标号,将所有的股票标号返回到lst中
def getStockList(lst, stockURL):
#2 sz 1 sh
html = getHTMLText(stockURL, "GB2312")
# soup = BeautifulSoup(html, 'html.parser')
content = re.findall(r"data:\[(.*?)\],recordsFiltered", html)[0]
#25
lists = content.split(",")
l=1
while l
python抓取动态网页(PythonPyQt4的思路和动态解析页面信息的解决思路!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-11-30 07:18
很久以前,在学习Python web编程的时候,涉及到一个Python urllib。您可以使用 urllib.urlopen("url").read() 轻松读取页面上的静态信息。但是,随着时代的发展,越来越多的网页使用jQuery、PHP等语言来动态生成页面信息。因此,使用urllib抓取页面的HTML还不足以达到预期的效果。
解决方案:
动态分析页面信息有一个最简单的想法。 Urllib 无法解析动态信息,但浏览器可以。浏览器上显示的处理信息实际上是经过处理的HTML文档。这为我们抓取动态页面信息提供了一个很好的思路。 Python-PyQt 中有一个著名的图形库。虽然 PyQt 是一个图形库,但它在 QtWebkit 内部。这是非常实用的。谷歌的Chrome和苹果的Safari都是基于WebKit核心开发的,所以我们可以通过PyQt中的QtWebKit将页面中的信息读取加载到HTML文档中,然后解析HTML文档,从我们要使用的HTML文档中提取出来信息。
所需材料:
作者本人使用的是 Mac OS X,Windows 和 Linux 平台应该使用相同的方法。
1、Qt4 库
库,而不是创建者。 Mac默认安装路径下的库应该是/home/username/Developor/,Qt4默认安装路径不要改动。否则安装可能会失败。
官网:
2、SIP、PyQt4
这两个软件可以在PyQt官网找到。源代码已下载。 Mac和Linux需要自己编译。
下载地址为:
在终端中,切换到解压文件所在的目录。
在终端输入
python configure.py
制作
sudo make install
安装和编译。
SIP 和 PyQt4 的安装方法是一样的。但是 PyQt4 依赖于 SIP。所以先安装SIP再安装PyQt4
1、2 两步完成后,安装Python PyQt4模块。在Python shell中输入import PyQt4,看看能不能找到PyQt4模块。
3、Spynner
spynner 是一个 QtWebKit 客户端,可以模拟浏览器完成加载页面、触发事件、填写表单等操作。
这个模块可以在 Python 的官方网站上找到。
下载地址:
解压后cd到安装目录,然后输入sudo python configure.py install安装模块。
这样Spynner模块的安装就完成了。在python shell中尝试import spynner,看看是否安装了模块。
Spynner 的简单使用
Spynner的功能很强大,但由于本人能力有限,下面介绍一下网页源代码的显示方式。
[python] 查看普通副本
#!/usr/bin/python#-*-coding:utf-8-*-importspynnerbrowser=spynner.Browser()#创建浏览器对象browser.hide()#打开浏览器并隐藏。 browser.load("")#browser类有一个类方法load,可以使用webkit来加载你要加载的页面信息。 #load(是你要加载的URL的字符串形式)printbrowser.html.encode("utf-8")#浏览器类的成员之一是html,就是页面后面的源码的字符串已处理#转码为UTF-8编码 open("Test.html",'w+').write(browser.html.encode("utf-8"))#也可以写成文件,浏览 设备打开。 browser.close()#关闭浏览器
通过这个程序,你可以很方便的显示webkit处理的页面的HTML源代码。
Spynner 应用程序
先介绍一下spynner的简单应用。通过一个简单的程序,你就可以得到你在浏览器中看到的页面的所有图片。可以使用 HTMLParser、BeautifulSoup 等来解析 HTMLParser 文档。我选择 HTMParser。
[python] 查看普通副本
#!/usr/bin/pythonimportspynnerimportHTMLParserimportosimporturllibclassMyParser(HTMLParser.HTMLParser):defhandle_starttag(self,tag,attrs):iftag=='img':url=dict(attrs)['src']name=os.path。 basename(dict(attrs)['src'])ifname.endswith('.jpg')orname.endswith('.png')orname.endswith('gif'):print"下载.....",nameurllib .urlretrieve(url,name)if__name__=="__main__":browser=spynner.Browser()browser.show()browser.load("")Parser=MyParser()Parser.feed(browser.html)print"Done" browser.close()
通过这个程序,您可以下载您在页面上看到的所有图片。几行简单的程序就可以完成这项艰巨的任务。实现图片的批量处理。这确实是Python语言的优势,所以就让繁重的任务交给第三方吧。 查看全部
python抓取动态网页(PythonPyQt4的思路和动态解析页面信息的解决思路!)
很久以前,在学习Python web编程的时候,涉及到一个Python urllib。您可以使用 urllib.urlopen("url").read() 轻松读取页面上的静态信息。但是,随着时代的发展,越来越多的网页使用jQuery、PHP等语言来动态生成页面信息。因此,使用urllib抓取页面的HTML还不足以达到预期的效果。
解决方案:
动态分析页面信息有一个最简单的想法。 Urllib 无法解析动态信息,但浏览器可以。浏览器上显示的处理信息实际上是经过处理的HTML文档。这为我们抓取动态页面信息提供了一个很好的思路。 Python-PyQt 中有一个著名的图形库。虽然 PyQt 是一个图形库,但它在 QtWebkit 内部。这是非常实用的。谷歌的Chrome和苹果的Safari都是基于WebKit核心开发的,所以我们可以通过PyQt中的QtWebKit将页面中的信息读取加载到HTML文档中,然后解析HTML文档,从我们要使用的HTML文档中提取出来信息。
所需材料:
作者本人使用的是 Mac OS X,Windows 和 Linux 平台应该使用相同的方法。
1、Qt4 库
库,而不是创建者。 Mac默认安装路径下的库应该是/home/username/Developor/,Qt4默认安装路径不要改动。否则安装可能会失败。
官网:
2、SIP、PyQt4
这两个软件可以在PyQt官网找到。源代码已下载。 Mac和Linux需要自己编译。
下载地址为:
在终端中,切换到解压文件所在的目录。
在终端输入
python configure.py
制作
sudo make install
安装和编译。
SIP 和 PyQt4 的安装方法是一样的。但是 PyQt4 依赖于 SIP。所以先安装SIP再安装PyQt4
1、2 两步完成后,安装Python PyQt4模块。在Python shell中输入import PyQt4,看看能不能找到PyQt4模块。
3、Spynner
spynner 是一个 QtWebKit 客户端,可以模拟浏览器完成加载页面、触发事件、填写表单等操作。
这个模块可以在 Python 的官方网站上找到。
下载地址:
解压后cd到安装目录,然后输入sudo python configure.py install安装模块。
这样Spynner模块的安装就完成了。在python shell中尝试import spynner,看看是否安装了模块。
Spynner 的简单使用
Spynner的功能很强大,但由于本人能力有限,下面介绍一下网页源代码的显示方式。
[python] 查看普通副本
#!/usr/bin/python#-*-coding:utf-8-*-importspynnerbrowser=spynner.Browser()#创建浏览器对象browser.hide()#打开浏览器并隐藏。 browser.load("")#browser类有一个类方法load,可以使用webkit来加载你要加载的页面信息。 #load(是你要加载的URL的字符串形式)printbrowser.html.encode("utf-8")#浏览器类的成员之一是html,就是页面后面的源码的字符串已处理#转码为UTF-8编码 open("Test.html",'w+').write(browser.html.encode("utf-8"))#也可以写成文件,浏览 设备打开。 browser.close()#关闭浏览器
通过这个程序,你可以很方便的显示webkit处理的页面的HTML源代码。
Spynner 应用程序
先介绍一下spynner的简单应用。通过一个简单的程序,你就可以得到你在浏览器中看到的页面的所有图片。可以使用 HTMLParser、BeautifulSoup 等来解析 HTMLParser 文档。我选择 HTMParser。
[python] 查看普通副本
#!/usr/bin/pythonimportspynnerimportHTMLParserimportosimporturllibclassMyParser(HTMLParser.HTMLParser):defhandle_starttag(self,tag,attrs):iftag=='img':url=dict(attrs)['src']name=os.path。 basename(dict(attrs)['src'])ifname.endswith('.jpg')orname.endswith('.png')orname.endswith('gif'):print"下载.....",nameurllib .urlretrieve(url,name)if__name__=="__main__":browser=spynner.Browser()browser.show()browser.load("")Parser=MyParser()Parser.feed(browser.html)print"Done" browser.close()
通过这个程序,您可以下载您在页面上看到的所有图片。几行简单的程序就可以完成这项艰巨的任务。实现图片的批量处理。这确实是Python语言的优势,所以就让繁重的任务交给第三方吧。
python抓取动态网页(千人基因组数据库中爬取CHB人群的等位基因频率信息解析)
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-11-30 07:16
该计划的目的:
根据特定的SNP列表,从千基因组数据库中爬取CHB群体的等位基因频率信息,例如。
因为网页是动态数据,内嵌了JavaScript代码,所以使用selenium来爬取信息。
Beautiful Soup 是一个python 库,主要功能是从网页中抓取数据。Beautiful Soup 提供了一些简单的、python 风格的函数来处理导航、搜索、修改分析树和其他功能。它是一个工具箱,为用户提供需要通过解析文档捕获的数据,避免复杂的正则表达式。
准备:源代码
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
def get_allele_feq(browser, snp):
browser.get(
'https://www.ncbi.nlm.nih.gov/v ... 39%3B %snp) #Load page
# browser.implicitly_wait(60) #智能等待xx秒
time.sleep(30) #加载时间较长,等待加载完毕
# browser.find_element_by_css_selector("div[title=\"Han Chinese in Bejing, China\"]") #use selenium function to find elements
# 把selenium的webdriver调用page_source函数在传入BeautifulSoup中,就可以用BeautifulSoup解析网页了
bs = BeautifulSoup(browser.page_source, "lxml")
# bs.find_all("div", title="Han Chinese in Bejing, China")
try:
race = bs.find(string="CHB")
race_data = race.find_parent("div").find_parent(
"div").find_next_sibling("div")
# print race_data
race_feq = race_data.find("span", class_="gt-selected").find_all("li") # class_ 防止Python中类关键字重复,产生语法错误
base1_feq = race_feq[0].text #获取标签的内容
base2_feq = race_feq[1].text
return snp, base1_feq, base2_feq # T=0.1408 C=0.8592
except NoSuchElementException:
return "%s:can't find element" %snp
def main():
browser = webdriver.Chrome() # Get local session of chrome
fh = open("./4diseases_snps_1kCHB_allele_feq.list2", 'w')
snps = open("./4diseases_snps.list.uniq2",'r')
for line in snps:
snp = line.strip()
response = get_allele_feq(browser, snp)
time.sleep(1)
fh.write("\t".join(response)) #unicode 编码的对象写到文件中后相当于print效果
fh.write("\n")
print "\t".join(response)
time.sleep(1) # sleep a few seconds
fh.close()
browser.quit() # 退出并关闭窗口的每一个相关的驱动程序
if __name__ == '__main__':
main()
参考资料:
1]:#美丽汤4.4.0个文件
2]:
3]:
4]:
5]:
6]:
7]: 查看全部
python抓取动态网页(千人基因组数据库中爬取CHB人群的等位基因频率信息解析)
该计划的目的:
根据特定的SNP列表,从千基因组数据库中爬取CHB群体的等位基因频率信息,例如。
因为网页是动态数据,内嵌了JavaScript代码,所以使用selenium来爬取信息。
Beautiful Soup 是一个python 库,主要功能是从网页中抓取数据。Beautiful Soup 提供了一些简单的、python 风格的函数来处理导航、搜索、修改分析树和其他功能。它是一个工具箱,为用户提供需要通过解析文档捕获的数据,避免复杂的正则表达式。
准备:源代码
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
def get_allele_feq(browser, snp):
browser.get(
'https://www.ncbi.nlm.nih.gov/v ... 39%3B %snp) #Load page
# browser.implicitly_wait(60) #智能等待xx秒
time.sleep(30) #加载时间较长,等待加载完毕
# browser.find_element_by_css_selector("div[title=\"Han Chinese in Bejing, China\"]") #use selenium function to find elements
# 把selenium的webdriver调用page_source函数在传入BeautifulSoup中,就可以用BeautifulSoup解析网页了
bs = BeautifulSoup(browser.page_source, "lxml")
# bs.find_all("div", title="Han Chinese in Bejing, China")
try:
race = bs.find(string="CHB")
race_data = race.find_parent("div").find_parent(
"div").find_next_sibling("div")
# print race_data
race_feq = race_data.find("span", class_="gt-selected").find_all("li") # class_ 防止Python中类关键字重复,产生语法错误
base1_feq = race_feq[0].text #获取标签的内容
base2_feq = race_feq[1].text
return snp, base1_feq, base2_feq # T=0.1408 C=0.8592
except NoSuchElementException:
return "%s:can't find element" %snp
def main():
browser = webdriver.Chrome() # Get local session of chrome
fh = open("./4diseases_snps_1kCHB_allele_feq.list2", 'w')
snps = open("./4diseases_snps.list.uniq2",'r')
for line in snps:
snp = line.strip()
response = get_allele_feq(browser, snp)
time.sleep(1)
fh.write("\t".join(response)) #unicode 编码的对象写到文件中后相当于print效果
fh.write("\n")
print "\t".join(response)
time.sleep(1) # sleep a few seconds
fh.close()
browser.quit() # 退出并关闭窗口的每一个相关的驱动程序
if __name__ == '__main__':
main()
参考资料:
1]:#美丽汤4.4.0个文件
2]:
3]:
4]:
5]:
6]:
7]:
python抓取动态网页(工具分析登录页面打开登录过程从分析可以看到哪些信息)
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2021-11-29 20:25
最近的项目在做一些数据整合,各个系统对应的接口就更奇怪了。数据整合的过程可以用八个字来概括:山中有路,水中有桥。
这两天碰巧出了问题。我们要集成的WEB系统没有提供专门的数据集成接口,没有API可以调整,也不允许访问数据库。无奈中,想知道能不能用python自动爬取。页。网页有SSO,应该使用开源的CAS框架,后面的页面都是动态JS和AJAX异步加载的。显然,这不像是直接使用Scrapy上传的普通静态页面。它必须是完美的。要模拟登陆动作,抓取后续动态内容,对页面结构和抓取内容的分析必不可少。
工具分析登陆页面
打开登录页面,按F12打开Chrome自带的分析工具。在Network选项卡中,可以看到当前浏览器显示页面的详细信息和提交的登录信息,如下图
网站 登录页面
从截图中可以看到,当我们访问app/this url的日志时,由于我们还没有登录,SSO会自动将我们重定向到登录页面,所以http状态是302重定向。
接下来,我们在页面输入账号密码,点击登录按钮,通过页面跟踪分析和模拟整个登录过程。这个过程一定要特别小心,因为很多CAS在登录页面都埋了很多隐藏的标记,一处是模仿不来的。它将无法登录,然后被重定向到开头。
分析登录过程
从分析中可以看出,在提交登录按钮时,会通过POST提交一个表单。除了账号、密码等显眼的字段外,表格中还有一个lt。经验告诉我们,这个字段应该隐藏在之前的登录页面上。它用于验证登录页面的合法性,因此我们需要从登录页面中查找并提取此信息。同时注意http的消息头。最好根据浏览器抓到的消息头来构造,因为网站也会验证里面的信息。
以下是登录的主要代码。我们基于python3和requests包处理https访问请求,模拟浏览器的行为,构造认证所需的信息并发送给网站。
import requestsimport urllib3from lxml import etreefrom ows_scrapy.ows_spider.write_csv import write_list_to_csv
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
s = requests.session()
s.trust_env = False # fastercookie = Noneusername = 'username'password = 'pwd'def login():
header = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=73E10849812940333A4AD2A2ABAEFB7D8CFF3E76A45340FFB687FD587D2EB97A49FC5F156D09DB1E17F129465AB8D8EBACEC', 'Host': '', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
form_data = { 'username': username, 'password': password, '_eventId': 'submit', 'pwdfirst': password[0:2], 'pwdsecond': password[2:5], 'pwdthird': password[5:]
}
login_url = 'https://.com/app/'
print('login...')
res = s.get(login_url, headers=header, verify=False) global cookie
cookie = res.cookies # 注意要保存cookie
print("get response from ows {0}, http status {1}".format(login_url, res.status_code))
login_url = res.url
header['Referer'] = login_url
header['Cookie'] = 'JSESSIONID=' + cookie['JSESSIONID']
form_data['lt'] = str(etree.HTML(res.content).xpath('//input[@name="lt"]/@value')[0]) #用xpath从页面上提取lt
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
cookie = res.cookies
print("post login params to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie))
res = s.send(res.next, allow_redirects=False, verify=False)
cookie = res.cookies
print("redirect to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie)) if res.status_code == 200 or res.status_code == 302: if cookie is not None and cookie.get(name='JSESSIONID', path='/app') is not None :
print('Successful login.') else:
print('WRONG w3id/password!')
sys.exit(0)
这里要特别注意,因为http是无状态的,需要cookies来保存网页的登录状态。页面成功后,页面的响应中会收录一个带有有效标记的cookie。登录的最终目的是获取并保存这个有效的cookie,这样后续的访问就不会被重定向到登录页面。
在 requests 方法中,只需将 cookie 添加到请求中即可。
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
分析动态内容页面
在动态页面中,页面显示的内容往往是通过js或者AJAX异步获取的,这明显不同于静态html页面的分析过程。使用 Chrome 的分析工具也可以轻松获取此信息。
分析动态页面
动态页面加载完成后,我们从所有请求中过滤XHR类型,找到我们想要的请求,然后在请求的Preview中就可以看到完整的对应信息了,请求的URL也可以从Obtained中查看在“标题”选项卡中。
接下来要做的和上面类似,构造一个消息来模拟浏览器向网站发送请求:
def get_content(order_id):
form_data = { 'roarand': 'BW09el5W3mW2sfbGbtWe7mWlwBsWqXg6znppnqkW3woJ5fcz5DnhfWXGonqkLsd0', 'start': '0', 'limit': '20', 'orderid': order_id, 'serviceId': 'test_gscsocsecurityincidentmanage_log_getList2'
}
header = { 'Accept': 'text/plain, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Host': '.com', 'Origin': 'https://.com', 'Referer': 'https://.com/app/104h/spl/test/ID_480_1511441539904_workflowdetail.spl?orderid=SOC-20180220-00000003', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest'
}
print('Start to scan order id ' + order_id)
url = 'https://.com/app/pageservices/service.do?forAccessLog={serviceName:test_gscsocsecurityincidentmanage_log_getList2,userId:571bdd42-10ca-4ce1-b41c-8a3f6632141f,tenantId:104h}&trackId=fec68f8e-f30a-4fa1-a8b1-41d3dd11fa4c'
res = s.post(url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False) #要加载上面登录成功的cookie
print(res.content) return res
重点其实就是从XHR中找到请求的URI,构造请求头并提交表单,最后一定要加上一个登录成功的cookie,否则会被重定向到登录页面。
有很多方法可以抓取动态页面。这种方式依赖的包相对较少,代码也比较灵活。爬取复杂登录页面时效果更好,但在分析页面登录机制时一定要特别小心。 查看全部
python抓取动态网页(工具分析登录页面打开登录过程从分析可以看到哪些信息)
最近的项目在做一些数据整合,各个系统对应的接口就更奇怪了。数据整合的过程可以用八个字来概括:山中有路,水中有桥。
这两天碰巧出了问题。我们要集成的WEB系统没有提供专门的数据集成接口,没有API可以调整,也不允许访问数据库。无奈中,想知道能不能用python自动爬取。页。网页有SSO,应该使用开源的CAS框架,后面的页面都是动态JS和AJAX异步加载的。显然,这不像是直接使用Scrapy上传的普通静态页面。它必须是完美的。要模拟登陆动作,抓取后续动态内容,对页面结构和抓取内容的分析必不可少。
工具分析登陆页面
打开登录页面,按F12打开Chrome自带的分析工具。在Network选项卡中,可以看到当前浏览器显示页面的详细信息和提交的登录信息,如下图

网站 登录页面
从截图中可以看到,当我们访问app/this url的日志时,由于我们还没有登录,SSO会自动将我们重定向到登录页面,所以http状态是302重定向。
接下来,我们在页面输入账号密码,点击登录按钮,通过页面跟踪分析和模拟整个登录过程。这个过程一定要特别小心,因为很多CAS在登录页面都埋了很多隐藏的标记,一处是模仿不来的。它将无法登录,然后被重定向到开头。
分析登录过程
从分析中可以看出,在提交登录按钮时,会通过POST提交一个表单。除了账号、密码等显眼的字段外,表格中还有一个lt。经验告诉我们,这个字段应该隐藏在之前的登录页面上。它用于验证登录页面的合法性,因此我们需要从登录页面中查找并提取此信息。同时注意http的消息头。最好根据浏览器抓到的消息头来构造,因为网站也会验证里面的信息。
以下是登录的主要代码。我们基于python3和requests包处理https访问请求,模拟浏览器的行为,构造认证所需的信息并发送给网站。
import requestsimport urllib3from lxml import etreefrom ows_scrapy.ows_spider.write_csv import write_list_to_csv
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
s = requests.session()
s.trust_env = False # fastercookie = Noneusername = 'username'password = 'pwd'def login():
header = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=73E10849812940333A4AD2A2ABAEFB7D8CFF3E76A45340FFB687FD587D2EB97A49FC5F156D09DB1E17F129465AB8D8EBACEC', 'Host': '', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
form_data = { 'username': username, 'password': password, '_eventId': 'submit', 'pwdfirst': password[0:2], 'pwdsecond': password[2:5], 'pwdthird': password[5:]
}
login_url = 'https://.com/app/'
print('login...')
res = s.get(login_url, headers=header, verify=False) global cookie
cookie = res.cookies # 注意要保存cookie
print("get response from ows {0}, http status {1}".format(login_url, res.status_code))
login_url = res.url
header['Referer'] = login_url
header['Cookie'] = 'JSESSIONID=' + cookie['JSESSIONID']
form_data['lt'] = str(etree.HTML(res.content).xpath('//input[@name="lt"]/@value')[0]) #用xpath从页面上提取lt
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
cookie = res.cookies
print("post login params to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie))
res = s.send(res.next, allow_redirects=False, verify=False)
cookie = res.cookies
print("redirect to {0}, http status {1}, cookie : {2}".format(login_url, res.status_code, cookie)) if res.status_code == 200 or res.status_code == 302: if cookie is not None and cookie.get(name='JSESSIONID', path='/app') is not None :
print('Successful login.') else:
print('WRONG w3id/password!')
sys.exit(0)
这里要特别注意,因为http是无状态的,需要cookies来保存网页的登录状态。页面成功后,页面的响应中会收录一个带有有效标记的cookie。登录的最终目的是获取并保存这个有效的cookie,这样后续的访问就不会被重定向到登录页面。
在 requests 方法中,只需将 cookie 添加到请求中即可。
res = s.post(login_url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False)
分析动态内容页面
在动态页面中,页面显示的内容往往是通过js或者AJAX异步获取的,这明显不同于静态html页面的分析过程。使用 Chrome 的分析工具也可以轻松获取此信息。

分析动态页面
动态页面加载完成后,我们从所有请求中过滤XHR类型,找到我们想要的请求,然后在请求的Preview中就可以看到完整的对应信息了,请求的URL也可以从Obtained中查看在“标题”选项卡中。
接下来要做的和上面类似,构造一个消息来模拟浏览器向网站发送请求:
def get_content(order_id):
form_data = { 'roarand': 'BW09el5W3mW2sfbGbtWe7mWlwBsWqXg6znppnqkW3woJ5fcz5DnhfWXGonqkLsd0', 'start': '0', 'limit': '20', 'orderid': order_id, 'serviceId': 'test_gscsocsecurityincidentmanage_log_getList2'
}
header = { 'Accept': 'text/plain, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Host': '.com', 'Origin': 'https://.com', 'Referer': 'https://.com/app/104h/spl/test/ID_480_1511441539904_workflowdetail.spl?orderid=SOC-20180220-00000003', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest'
}
print('Start to scan order id ' + order_id)
url = 'https://.com/app/pageservices/service.do?forAccessLog={serviceName:test_gscsocsecurityincidentmanage_log_getList2,userId:571bdd42-10ca-4ce1-b41c-8a3f6632141f,tenantId:104h}&trackId=fec68f8e-f30a-4fa1-a8b1-41d3dd11fa4c'
res = s.post(url, headers=header, params=form_data, cookies=cookie, allow_redirects=False, verify=False) #要加载上面登录成功的cookie
print(res.content) return res
重点其实就是从XHR中找到请求的URI,构造请求头并提交表单,最后一定要加上一个登录成功的cookie,否则会被重定向到登录页面。
有很多方法可以抓取动态页面。这种方式依赖的包相对较少,代码也比较灵活。爬取复杂登录页面时效果更好,但在分析页面登录机制时一定要特别小心。