selenium python 爬虫+python怎么获取动态ip

Python用selenium获取动态加载页面的数据? - 知乎10被浏览1645分享邀请回答12 条评论分享收藏感谢收起Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容-微众圈
微众圈,我的微信生活圈!
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
摘自公众号:发布时间: 19:43:20
1 引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtractor的技术路线过程中所做的编程实验。这是第二部分,第一部分实验了用xslt方式一次性提取静态网页内容并转换成xml格式。留下了一个问题:javascript管理的动态内容怎样提取?那么本文就回答这个问题。2 提取动态内容的技术部件 在上一篇python使用xslt提取网页数据中,要提取的内容是直接从网页的source code里拿到的。但是一些Ajax动态内容是在source code找不到的,就要找合适的程序库把异步或动态加载的内容加载上来,交给本项目的提取器进行提取。python可以使用selenium执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。selenium自己不带浏览器,可以使用第三方浏览器如Firefox,Chrome等,也可以使用headless浏览器如PhantomJS在后台执行。3 源代码和实验过程 假如我们要抓取京东手机页面的手机名称和价格(价格在网页源码是找不到的),如下图:
第一步:利用集搜客谋数台的直观标注功能,可以极快速度自动生成一个调试好的抓取规则,其实是一个标准的xslt程序,如下图,把生成的xslt程序拷贝到下面的程序中即可。注意:本文只是记录实验过程,实际系统中,将采用多种方式把xslt程序注入到内容提取器重。 第二步:执行如下代码(在windows10, python3.2下测试通过,下载源代码请见文章末尾的GitHub源),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码没有几行,足以见得Python之强大。 #/usr/bin/pythonfrom urllib import requestfrom lxml import etreefrom selenium import webdriverimport time# 京东手机商品页面url = "/1312640.html"# 下面的xslt是通过集搜客的谋数台图形界面自动生成的xslt_root = etree.XML("""\&xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" &&xsl:template match="/"&&商品&&xsl:apply-templates select="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())&0 and count(.//*[@id='name']/h1/text())&0]" mode="商品"/&&/商品&&/xsl:template&&xsl:template match="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())&0 and count(.//*[@id='name']/h1/text())&0]" mode="商品"&&item&&价格&&xsl:value-of select="*//*[@id='summary-price']/div[position()=2]/strong/text()"/&&xsl:value-of select="*[@id='summary-price']/div[position()=2]/strong/text()"/&&xsl:if test="@id='summary-price'"&&xsl:value-of select="div[position()=2]/strong/text()"/&&/xsl:if&&/价格&&名称&&xsl:value-of select="*//*[@id='name']/h1/text()"/&&xsl:value-of select="*[@id='name']/h1/text()"/&&xsl:if test="@id='name'"&&xsl:value-of select="h1/text()"/&&/xsl:if&&/名称&&/item&&/xsl:template&&/xsl:stylesheet&""")# 使用webdriver.PhantomJSbrowser = 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得到整个domhtml = browser.execute_script("return document.documentElement.outerHTML")doc = etree.HTML(html)# 用xslt从dom中提取需要的字段result_tree = transform(doc)print(result_tree) 第三步:下图可以看到,网页中的手机名称和价格被正确抓取下来了
End.作者:fullerhua(中国统计网特邀认证作者) 本文为中国统计网原创文章,需要转载请联系中国统计网( ),转载时请注明作者及出处,并保留本文链接。 更多精彩,长按下方图片中的二维码,下载APP查看。
微信号:cntongjiPython 如何在脚本中设置phantomjs的IP【selenium吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:896贴子:
Python 如何在脚本中设置phantomjs的IP收藏
写了个爬虫,弄了个代理IP池,user-agen池,对网站循环请求,要如何修改IP,user-agen,实现每次请求都是不同IP和user-agent。
selenium?-华为软件开发云CloudIDE免费公测,为开发者提供一站式开发环境 .轻量,快速,智能的云化WebIDE平台,提升研发效率,立即体验!
登录百度帐号推荐应用在一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtractor的技术路线过程中所做的编程实验。这是第二部分,第一部分实验了用xslt方式一次性。留下了一个问题:javascript管理的动态内容怎样提取?那么本文就回答这个问题。
2,提取动态内容的技术部件
在上一篇中,要提取的内容是直接从网页的source code里拿到的。但是一些Ajax动态内容是在source code找不到的,就要找合适的程序库把异步或动态加载的内容加载上来,交给本项目的提取器进行提取。
python可以使用执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。selenium自己不带浏览器,可以使用第三方浏览器如Firefox,Chrome等,也可以使用headless浏览器如在后台执行。
3,源代码和实验过程
假如我们要抓取的手机名称和价格(价格在网页源码是找不到的),如下图:
jd_mobile.jpg (147.3 KB, 下载次数: 52)
15:58 上传
第一步:利用的直观标注功能,可以极快速度自动生成一个调试好的抓取规则,其实是一个标准的xslt程序,如下图,把生成的xslt程序拷贝到下面的程序中即可。注意:本文只是记录实验过程,实际系统中,将采用多种方式把xslt程序注入到内容提取器重。
jd_mobile_xslt.jpg (120.21 KB, 下载次数: 54)
16:02 上传
第二步:执行如下代码(在windows10, python3.2下测试通过,源代码下载地址请见文章末尾GitHub),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码没有几行,足以见得Python之强大#/usr/bin/python
#
版本2.0
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = &/4325123.html&
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML(&&&\
&xsl:stylesheet version=&1.0& xmlns:xsl=&http://www.w3.org/1999/XSL/Transform& &
&xsl:template match=&/&&
&li&
&xsl:apply-templates select=&//*[@class='sku-name' and count(././text())&0]& mode=&li&/&
&/li&
&/xsl:template&
&xsl:template match=&//*[@class='sku-name' and count(././text())&0]& mode=&li&&
&item&
&商品名称&
&xsl:value-of select=&./text()&/&
&/商品名称&
&京东价&
&xsl:value-of select=&following-sibling::div[position()=2]//*[@class='p-price']/span[position()=2]/text()&/&
&/京东价&
&/item&
&/xsl:template&
&/xsl:stylesheet&&&&)
# 使用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)复制代码
第三步:下图可以看到,网页中的手机名称和价格被正确抓取下来了
jd_mobile_result.jpg (29.24 KB, 下载次数: 60)
16:05 上传
4,接下来阅读
至此,我们通过两篇文章演示怎样抓取静态和动态网页内容,都采用了xslt一次性将需要的内容从网页上提取出来,其实xslt是一个比较复杂的程序语言,如果手工编写xslt,那么还不如写成离散的xpath。如果这个xslt不是手工写出来的,而是程序自动生成的,这就有意义了,程序员再也不要花时间编写和调测抓取规则了,这是很费时费力的工作。下一篇《》将讲述怎样生成xslt。
5,集搜客GooSeeker开源代码下载源
6,文档修改历史
:V2.0,增补文字说明
:V2.1,增加第五章:源代码下载源,并更换github源的网址
原来PhantomJS类似于一个无头浏览器啊,不知道他的适用范围广不广。如果用selenium驱动Firefox或者Chrome的无头浏览器会怎样?是否也很容易用?
DS打数机能够自动滚屏、连续动作和模拟点击,不知道这个框架能否实现
在简书上看到这么一篇文章《》,用Qt web kit库。我很纳闷,这篇文章和上文都是把document变成字符串以后,交给lxml的etree再解析成dom树,然后用xpath或者xslt进行转换。这样岂不多了一道?难道是我理解错了?
PhantomJS为什么要返回outerHTML?为什么不直接用documentElement?
执行lxml的etree.HTML(), 是把PhantomJS返回的documentElement.outerHTML转换成特定格式的element tree
实测documentElement.outerHTML返回值是整个DOM, 如果取documentElement的返回值,则只拿到下面的这串:
&selenium.webdriver.remote.webelement.WebElement (session=&--d63d1&, element=&:wdc:1&)&
执行lxml的etree.HTML(), 是把PhantomJS返回的documentElement.outerHTML转换成特定格式的element tree
Python我是刚刚学,这里我糊涂了,但是我仔细看过DOM国际规范。我有下面的猜测:
1,outerHTML似乎返回的是一个字符串
2,用etree.HTML()把这个字符串转换成了elementtree对象,这个tree对象能用etree的xpath进行定位,那么很可能这个tree对象不是标准的documentElement对象,而是仿DOM的对象结构
3,你的测试结果那么奇怪,会不会是python内部的对象id?
4,如果selenium能够返回一个标准的documentElement对象,那么Python有没有标准的DOM访问接口?比如,getElementsByTag(), getElementById()之类的
5,如果支持标准DOM,是不是就不用转成element tree了?
本帖最后由 shenzhenwan10 于
16:41 编辑
我理解etree.HTML(), etree.XML()这几个方法就是用python的数据结构建立一棵树,用于之后对etree的操作
目前python库实现了xslt提取的只找到了lxml的etree,实现了xpath提取的倒是不少,如BS4, HTML parser
如果用selenium.webdriver来直接操作浏览器,那就不用转换了。
比如下面的几行代码:
driver = webdriver.Firefox(&C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe&)
driver.get(&&)
time.sleep(10)
driver.find_element_by_id(&TANGRAM__PSP_3__userName&).click()
driver.find_element_by_id(&TANGRAM__PSP_3__userName&).send_keys(&dali02310&)复制代码
如果用selenium.webdriver来直接操作浏览器,那就不用转换了。
比如下面的几行代码:
能否简单解释一下上面这段代码是干什么用的?那个网址是哪里?为什么要这么做?
我理解etree.HTML(), etree.XML()这几个方法就是用python的数据结构建立一棵树,用于之后对etree的操作
我看到一段别人写的代码,用Qt webkit 的driver,刚才还看到你的跟帖用Firefox的driver。我一直怀疑这样做的能力到底有多强。原因分析如下:
无论用.net编程工具直接操作IE或者Firefox的nsBrowser,还是你这些代码,以及webkit driver,你都可以想象成用一个编程语言操作一个黑盒子,你能控制这个黑盒子的能力局限在这个盒子提供的接口能力。从面向对象技术来说,这种接口协约确保了安全性和一致性,这是来自于“约束”的。
如果另一条路线:我直接进入到这个盒子里面,嵌入我的代码,把这个盒子的其它功能作为我的四肢,我的代码指挥他们,就可以不受接口的约束。GooSeeker网络爬虫DS打数机就是用这个思路做成的,他可以模拟人的任何操作浏览器的行为。
也许是我对python理解不够,权当抛砖引玉
爬wish等瀑布流网站时使用清除老数据功能从淘宝的买家评论中,能挖掘出什么有用的信连续动作:如何把抓到的信息与动作步骤对应淘宝开店运营十大攻略深圳市咨询投诉分析
12345678910
Fuller帖子:4576 ym帖子:1465 xandy帖子:1084在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我要抓取如下网站的信息:,想获取里面所有文件的链接,然后下载下来。这个网页时动态加载的,在源代码里面没有链接,所以我尝试用selenium+phantomjs的方法来获取内容,但是提示说找不到,想问问大家问题在哪儿?代码如下:
# -*-coding:utf8 -*-
import requests
from selenium import webdriver
import time
class CninfInfo:
def __init__(self):
self.url = ".cn/cninfo-new/index"
self.driver = webdriver.PhantomJS()
def GetInfo(self):
url = ".cn/information/companyinfo_n.html?fulltext?szcn300027"
time.sleep(10)
names = self.driver.find_elements_by_xpath("//ul[@class='ct-line']/li/div[@class='g3']/dd/span[@class='d1']/a")
for name in names:
print("名称为:",name.text)
if __name__ == "__main__":
CI = CninfInfo()
a = CI.GetInfo()
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这仅仅是一个post提交,为什么要搞得这么复杂
import requests, json
url = '.cn/cninfo-new/disclosure/szse/fulltext'
data = 'stock=300027&searchkey=&category=&pageNum=1&pageSize=15&column=szse_gem&tabName=latest&sortName=&sortType=&limit=&seDate='
headers = {
'Content-Type': 'application/x-www-form- charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (M Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0. Safari/537.36'
r = requests.post(url, data=data, headers=headers)
result = json.loads(r.text)
files = [_[0]['adjunctUrl'] for _ in result['classifiedAnnouncements']]
for file in files:
file_url = '.cn/{0}'.format(file)
file_name = file.split('/')[2]
with open(file_name, 'w') as f:
f.write(requests.get(file_url).content)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
目测没有调用 driver.get(url)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
首先输出完整的xml目录树,看看目录树中有没有你想要的数据
如果有再检查xpath代码有没有错误,如果目录树正确,可以尝试替换xpath代码为
//*[@id="ul_a_latest"]/li[2]/div[3]/dd[1]/span[1]/a
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
对于selenium不是很懂,但也玩过几次,可以看我的博客上的几篇文章,。主要问题不是1楼所说的GET问题。而是它使用了一个iframe。需要先选定它,然后才能选中下面的元素。我用nodejs做了个示例,请自己看吧。
var webdriver = require('selenium-webdriver'),
By = require('selenium-webdriver').By,
until = require('selenium-webdriver').
var driver = new webdriver.Builder()
.forBrowser('chrome')
driver.get('.cn/information/companyinfo_n.html?fulltext?szcn300027');
driver.switchTo().frame('i_nr');
driver.findElements(By.css('span.d1&a')).then(fenxi);
function fenxi(ele){
for(var e in ele){
ele[e].getOuterHtml().then(function(oh)
console.log(oh);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
分页内容式是ajax请求局部刷新得到的,关于链接则是得到数据的参数拼接得到的,
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:

我要回帖

更多关于 selenium python教程 的文章

 

随机推荐