python用selenium爬取网页数据(python爬虫获取网页数据)
Python + selenium + phantomjs 求助,爬一个网站的信息
一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览器PhantomJS来抓取javascript渲染的页面,下面实现一个简单的爬取
环境搭建
准备工具:python3.5,selenium,phantomjs
我的电脑里面已经装好了python3.5
安装Selenium
1
pip3 install selenium
安装Phantomjs
按照系统环境下载phantomjs,下载完成之后,将phantomjs.exe解压到python的script文件夹下
使用selenium+phantomjs实现简单爬虫
1
2
3
4
5
6
7
8
9
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get('') #加载网页
data = driver.page_source #获取网页文本
driver.save_screenshot('1.png') #截图保存
print(data)
driver.quit()
selenium+phantomjs的一些使用方法
设置请求头里的user-Agent
1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
dcap = dict(DesiredCapabilities.PHANTOMJS) #设置useragent
dcap['phantomjs.page.settings.userAgent'] = ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 ') #根据需要设置具体的浏览器信息
driver = webdriver.PhantomJS(desired_capabilities=dcap) #封装浏览器信息
driver.get('') #加载网页
data = driver.page_source #获取网页文本
driver.save_screenshot('1.png') #截图保存
print(data)
driver.quit()
请求超时设置
webdriver类中有三个和时间相关的方法:
1.pageLoadTimeout 设置页面完全加载的超时时间,完全加载即完全渲染完成,同步和异步脚本都执行完
2.setScriptTimeout 设置异步脚本的超时时间
3.implicitlyWait 识别对象的智能等待时间
1
2
3
4
5
6
7
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_page_load_timeout(5) #设置超时时间
driver.get('')
print(driver.title)
driver.quit()
设置浏览器窗口大小
调用启动的浏览器不是全屏的,有时候会影响我们的某些操作,所以我们可以设置全屏
1
2
driver.maximize_window() #设置全屏
driver.set_window_size('480','800') #设置浏览器宽480,高800
元素定位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_page_load_timeout(5)
driver.get('')
try:
driver.get('')
driver.find_element_by_id('kw') # 通过ID定位
driver.find_element_by_class_name('s_ipt') # 通过class属性定位
driver.find_element_by_name('wd') # 通过标签name属性定位
driver.find_element_by_tag_name('input') # 通过标签属性定位
driver.find_element_by_css_selector('#kw') # 通过css方式定位
driver.find_element_by_xpath("//input[@id='kw']") # 通过xpath方式定位
driver.find_element_by_link_text("贴吧") # 通过xpath方式定位
print(driver.find_element_by_id('kw').tag_name ) # 获取标签的类型
except Exception as e:
print(e)
driver.quit()
操作浏览器前进或后退
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from selenium import webdriver
driver = webdriver.PhantomJS()
try:
driver.get('') #访问百度首页
driver.save_screenshot('1.png')
driver.get('') #访问新浪首页
driver.save_screenshot('2.png')
driver.back() #回退到百度首页
driver.save_screenshot('3.png')
driver.forward() #前进到新浪首页
driver.save_screenshot('4.png')
except Exception as e:
print(e)
driver.quit()
从零开始学Python-使用Selenium抓取动态网页数据
AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。
因为传统的网页在传输数据格式方面,使用的是 XML 语法,因此叫做 AJAX ,其实现在数据交互基本上都是使用 JSON 。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在 右键-查看网页源代码 还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。
法1:直接分析ajax调用的接口。然后通过代码请求这个接口。
法2:使用Selenium+chromedriver模拟浏览器行为获取数据。
Selenium 相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。 chromedriver 是一个驱动 Chrome 浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
现在以一个简单的获取百度首页的例子来讲下 Selenium 和 chromedriver 如何快速入门:
参考:Selenium的使用
直接直接分析ajax调用的接口爬取
selenium结合lxml爬取
从零开始学python爬虫(八):selenium提取数据和其他使用方法
知识点:
知识点:了解 driver对象的常用属性和方法
注意:最新版本的selenium已经取消了这种格式,取而代之的是:
你要先导入:
然后再:
知识点:掌握 driver对象定位标签元素获取标签对象的方法
代码实现,如下,获取腾讯新闻首页的新闻标签的内容。
知识点:掌握 元素对象的操作方法
参考代码示例:
知识点:掌握 selenium控制标签页的切换
知识点:掌握 selenium控制frame标签的切换
知识点:掌握 利用selenium获取cookie的方法
知识点:掌握 selenium控制浏览器执行js代码的方法
知识点:掌握 手动实现页面等待
知识点:掌握 selenium开启无界面模式
知识点:了解 selenium使用代理ip
知识点:了解 selenium替换user-agent
Python爬虫实战(3)selenium完成瀑布流数据爬取
爬取时间:2021/01/27
系统环境:Windows 10
所用工具:Jupyter Notebook\Python 3.0
涉及的库:selenium\time\pandas\matplotlib\jieba\stylecloud
蛋肥想法: 借助selenium,实现对“查看更多”的自动点击,目标是获取2020年的文章相关数据。
蛋肥想法: 36氪的数据很满足强迫症,没有空格换行,只需筛选出2020年的数据保存。
蛋肥想法: 此次重点是学习selenium,所以只简单做一下数据可视化。
python爬取大量数据(百万级)
当用python爬取大量网页获取想要的数据时,最重要的问题是爬虫中断问题,python这种脚本语言,一中断
进程就会退出,怎么在中断后继续上次爬取的任务就至关重要了。这里就重点剖析这个中断问题。
第一个问题: 简单点的用动态代理池就能解决,在爬取大量数据的时候,为了速度不受影响,建议使用一些缓
存的中间件将有效的代理 ip 缓存起来,并定时更新。这里推荐 github 这个仓库
, 它会做ip有效性验证并将 ip 放入 redis ,不过实现过于复杂
了,还用到了 db ,个人觉得最好自己修改一下。困难点的就是它会使用别的请求来进行判断当前的ip是否
是爬虫,当我们过于聚焦我们的爬虫请求而忽略了其他的请求时,可能就会被服务器判定为爬虫,进而这个ip
会被列入黑名单,而且你换了ip一样也会卡死在这里。这种方式呢,简单点就用 selenium + chrome 一个一个
去爬,不过速度太慢了。还是自己去分析吧,也不会过复杂的。
第二个问题: 网络连接超时是大概率会遇到的问题,有可能是在爬取的时候本地网络波动,也有可能是爬
取的服务端对ip做了限制,在爬取到了一定量级的时候做一些延迟的操作,使得一些通用的 http 库超时
( urllib )。不过如果是服务端动的手脚一般延迟不会太高,我们只需要人为的设置一个高一点的
timeout 即可(30 秒),最好在爬取开始的时候就对我们要用的爬取库进行一层封装,通用起来才好改
动。
第三个问题: 在解析大量静态页面的时候,有些静态页面的解析规则不一样,所以我们就必须得做好断点
续爬的准备了( PS : 如果简单的忽略错误可能会导致大量数据的丢失,这就不明智了)。那么在调试的过
程中断点续爬有个解决方案,就是生产者和消费者分离,生产者就是产生待爬 url 的爬虫,消费者就是爬取
最终数据的爬虫。最终解析数据就是消费者爬虫了。他们通过消息中间件连接,生产者往消息中间件发送待
爬取的目标信息,消费者从里面取就行了,还间接的实现了个分布式爬取功能。由于现在的消费中间件都有
ack 机制,一个消费者爬取链接失败会导致消息消费失败,进而分配给其他消费者消费。所以消息丢失的
概率极低。不过这里还有个 tips , 消费者的消费超时时间不能太长,会导致消息释放不及时。还有要开启
消息中间价的数据持久化功能,不然消息产生过多而消费不及时会撑爆机器内存。那样就得不偿失了。
第四个问题: 这种情况只能 try except catch 住了,不好解决,如果单独分析的话会耗费点时间。但在
大部分数据 (99%) 都正常的情况下就这条不正常抛弃就行了。主要有了第三个问题的解决方案再出现这
种偶尔中断的问就方便多了。
希望能帮到各位。
python爬虫怎么做?
大到各类搜索引擎,小到日常数据采集,都离不开网络爬虫。爬虫的基本原理很简单,遍历网络中网页,抓取感兴趣的数据内容。这篇文章会从零开始介绍如何编写一个网络爬虫抓取数据,然后会一步步逐渐完善爬虫的抓取功能。
工具安装
我们需要安装python,python的requests和BeautifulSoup库。我们用Requests库用抓取网页的内容,使用BeautifulSoup库来从网页中提取数据。
安装python
运行pipinstallrequests
运行pipinstallBeautifulSoup
抓取网页
完成必要工具安装后,我们正式开始编写我们的爬虫。我们的第一个任务是要抓取所有豆瓣上的图书信息。我们以/subject/26986954/为例,首先看看开如何抓取网页的内容。
使用python的requests提供的get()方法我们可以非常简单的获取的指定网页的内容,代码如下:
提取内容
抓取到网页的内容后,我们要做的就是提取出我们想要的内容。在我们的第一个例子中,我们只需要提取书名。首先我们导入BeautifulSoup库,使用BeautifulSoup我们可以非常简单的提取网页的特定内容。
连续抓取网页
到目前为止,我们已经可以抓取单个网页的内容了,现在让我们看看如何抓取整个网站的内容。我们知道网页之间是通过超链接互相连接在一起的,通过链接我们可以访问整个网络。所以我们可以从每个页面提取出包含指向其它网页的链接,然后重复的对新链接进行抓取。
通过以上几步我们就可以写出一个最原始的爬虫。在理解了爬虫原理的基础上,我们可以进一步对爬虫进行完善。
写过一个系列关于爬虫的文章:/i6567289381185389064/。感兴趣的可以前往查看。
Python基本环境的搭建,爬虫的基本原理以及爬虫的原型
Python爬虫入门(第1部分)
如何使用BeautifulSoup对网页内容进行提取
Python爬虫入门(第2部分)
爬虫运行时数据的存储数据,以SQLite和MySQL作为示例
Python爬虫入门(第3部分)
使用seleniumwebdriver对动态网页进行抓取
Python爬虫入门(第4部分)
讨论了如何处理网站的反爬虫策略
Python爬虫入门(第5部分)
对Python的Scrapy爬虫框架做了介绍,并简单的演示了如何在Scrapy下进行开发
Python爬虫入门(第6部分)