爬虫的终极解决方案selenium+phantomjs/Headless Chrome

首先安装selenium:pip install selenium

如果你想要让谷歌以页面的形式完成自动化的操作,你可以下载一个和你的谷歌版本相对应的谷歌浏览器驱动,下载地址如下:http://chromedriver.storage.googleapis.com/index.html,谷歌浏览器版本和驱动的对应关系可以在下面的链接中查看:http://blog.csdn.net/huilan_same/article/details/51896672

小试一下(向百度里面输入豆瓣电影并进行自动点击):

from selenium import webdriver

import time

#模拟创建一个浏览器对象,然后可以通过对象去操作浏览器

pt  = r'F:\google驱动\2.36\chromedriver.exe'

browser = webdriver.Chrome(executable_path=pt)

url = 'http://www.baidu.com/'

browser.get(url)

#暂停2秒,已达到完全模拟浏览器的效果

time.sleep(2)

#查找百度页面的input输入框

baidu_input = browser.find_element_by_id('kw')

#向百度框里面输入文字

baidu_input.send_key('豆瓣电影')

 

#暂停2秒

time.sleep(2)

#查找百度的搜索按钮

bt = browser.find_elements_by_class_name('s_btn')[0]

bt.click()

 

#暂停5秒

time.sleep(5)

#关闭并退出浏览器

browser.quit()

selenium:是一个python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器自动完成一些操作,使用下面的方法,查找指定的元素可进行操作:find_element_by_id :根据id找节点;find_elements_by_name :根据name查找;find_elements_by_xpath:根据xpath查找;find_elements_by_tag_name :根据标签名查找;find_elements_by_class_name:根据class名字查找;find_elements_by_css_selector:根据选择器查找;find_elements_by_link_text :根据链接内容查找。

PhantomJS:是一款无界面的浏览器,以爬取阳关宽频网上的视频为例:

'''
首先向365yg.com发送请求,并获取响应,然后去解析响应,将里面所有标题链接获取到并依次向每个标题链接发送请求
并获取响应,从而解析响应,获取video标签的src属性,并向src属性发送请求,获取响应,然后将内容保存到本地即可。

'''

代码如下:

import requests
from lxml import etree
import json
import time
from selenium import webdriver
#请求头
headers ={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
def handle_title(widen):
#将捕获的接口得到
#api/pc/feed/?max_behot_time=1528197881&category=video_new&utm_source=toutiao&widen=1&tadrequire=true&as=A1854BD1F608533&cp=5B16D825E323BE1&_signature=g4eNzwAA2J0KZrRVc9EFpoOHjd HTTP/
url = 'http://www.365yg.com/api/pc/feed/?max_behot_time=1528200083&category=video_new&utm_source=toutiao&widen={}&tadrequire=true&as=A1D55B5186189B9&cp=5B16A8F94BB90E1&_signature=oP61JRAa-.cpH4y.oI8FF6D-tT'
url = url.format(widen)
# 发送请求信息
r = requests.get(url=url, headers=headers)
# 解析内容,因为返回的是json格式数据,直接解析json格式即可
# 通过分析,要data里面的 title\source_url
# 将json数据转化为python对象
obj = json.loads(r.text)
# 取出所有和视频相关的数据,data是一个列表,里面存放的都是字典
data = obj['data']
# 循环data列表,依次取出每一个视频信息
for video_data in data:
title = video_data['title']
a_href = 'http://www.365yg.com' + video_data['source_url']
# 发送请求,获取内容,解析内容,获取src
handle_href(a_href, title)
def handle_href(a_href,title):
# 通过phantomjs来进行解决,
browser = webdriver.PhantomJS(r'F:\爬虫知识\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe')
browser.get(a_href)
time.sleep(3)
# 获取源码,生成tree对象,然后查找video里面的src属性
tree = etree.HTML(browser.page_source)
video_src = tree.xpath('//video[@id="vjs_video_3_html5_api"]/source/@src')[0]
filepath = 'shipin/' + title + '.mp4'
print('%s开始下载......' % title)
r = requests.get(video_src)
with open(filepath, 'wb') as fp:
fp.write(r.content)
print('%s结束下载' % title)
def main():
#解析首页,返回所有的标题链接
for i in range(1,2):
handle_title(i)
if __name__ == '__main__':

main()

以上是通过phantomjs进行实现的,可是由于现在phantomjs都不维护了,所以也可以使用无头浏览器来进行操作,不过注意这种无头浏览器模式,在mac、linux上,版本号在59+以上,才支持这种模式,在windows上,要求版本号在60+以上,才支持这种模式。

代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 驱动路径
path = r'F:\google驱动\2.36\chromedriver.exe'
# 创建浏览器对象
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
url = 'http://www.baidu.com/'
browser.get(url)

time.sleep(3)

#为当前浏览器所到的页面进行拍照

browser.save_screenshot('baidu.png')
browser.quit()

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值