pip install selenium==2.48.0 新版本不支持phantomjs
下载phantomjs
implicitly_wait():
浏览器解释JS脚本是需要时间的,但实际上这个时间并不好确定,
如果我们手动设定时间间隔的话,设置多了浪费时间,设置少了又会丢失数据
implictly_wait函数则完美解决了这个问题,给他一个时间参数,他会只能等待,当js完全解释完毕就会自动执行下一步。
Selenium 本事给出了18个函数来定位有效数据的位置:
找到第一个匹配的元素
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
一次查找多个元素 (这些方法会返回一个list列表):
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
首先调用find_element_by_id()方法找到了text栏的位置,
然后通过send_keys()方法来输入关键字
接着还是通过find_element_by_id()方法找到提按钮,
最后我们通过.submint()方法来模拟点击,发送搜索请求
通过browser.find_elements_by_class_name()方法定位到搜索结果,
返回一个element类型的列表,
再通过element.text 和 element.get_attribute()方法来获取我们需要的数据。
最后我们遍历一边results列表就能获得我们想要的答案了。
'''
使用Selenium模拟浏览器
抓取百度查询结果
'''
# 导入selenium模块中的web引擎
from selenium import webdriver
# 建立浏览器对象 ,通过Phantomjs
browser = webdriver.PhantomJS()
# 设置访问的url
url = 'https://www.baidu.com'
# 访问url
browser.get(url)
# 等待一定时间,让js脚本加载完毕
browser.implicitly_wait(3)
# 找到搜索框
text = browser.find_element_by_id('kw')
# 清空搜索框的文字
text.clear()
# 填写搜索框的文字
text.send_keys('命运冠位指定')
# 找到submit按钮
button = browser.find_element_by_id('su')
# 点击按钮 提交搜索请求
button.submit()
# 查看当前浏览器标题
print(browser.title)
# 以截图的方式查看浏览器的页面
browser.save_screenshot('text.png')
# 找到结果 结果保存为列表变量
results = browser.find_elements_by_class_name('t')
# 循环遍历找出每个结果的标题和url
for result in results:
print('标题:{} 超链接:{}'.format(result.text,
result.find_element_by_tag_name('a').get_attribute('href')))
实践:获取快代理
get_urls()
这个函数功能是返回一个需要爬取代理页面的url链接的列表
get_proxy_list()
这个函数通过Selenium和PhantomJS模拟一个浏览器环境,
首先 从get_urls函数返回的列表中拿出一个链接,打开
接着 在浏览器里通过find_elements_by_xpath()方法来找到每一条我们需要的数据,并保存在item里。
最后 将item返回给saveFile()函数处理。
saveFile()
这个函数没什么好说的,
就是将item理的数据写入到本地。
保存在proxy.txt文本中。
'''
selenium模拟浏览器爬虫
爬取快代理:http://www.kuaidaili.com/
'''
from selenium import webdriver
class Item(object):
'''
我们模拟Scrapy框架
写一个item类出来,
用来表示每一个爬到的代理
'''
ip = None # ip地址
port = None # 端口
anonymous = None # 是否匿名
type = None # http or https
local = None # 物理地址
speed = None # 速度
class GetProxy(object):
'''
获取代理的类
'''
def __init__(self):
'''
初始化整个类
'''
self.starturl = 'http://www.kuaidaili.com/free/inha/'
self.urls = self.get_urls()
self.proxylist = self.get_proxy_list(self.urls)
self.filename = 'proxy.txt'
self.saveFile(self.filename,self.proxylist)
def get_urls(self):
'''
返回一个代理url的列表
'''
urls = []
for i in range(1,2):
url = self.starturl+str(i)
urls.append(url)
return urls
def get_proxy_list(self,urls):
'''
返回抓取到代理的列表
整个爬虫的关键
'''
browser = webdriver.PhantomJS()
proxy_list = []
for url in urls:
browser.get(url)
browser.implicitly_wait(3)
# 找到代理table的位置
elements = browser.find_elements_by_xpath('//tbody/tr')
for element in elements:
item = Item()
item.ip = element.find_element_by_xpath('./td[1]').text
item.port = element.find_element_by_xpath('./td[2]').text
item.anonymous = element.find_element_by_xpath('./td[3]').text
item.local = element.find_element_by_xpath('./td[4]').text
item.speed = element.find_element_by_xpath('./td[5]').text
print(item.ip)
proxy_list.append(item)
browser.quit()
return proxy_list
def saveFile(self,filename,proxy_list):
'''
将爬取到的结果写到本地
'''
with open(filename,'w') as f:
for item in proxy_list:
f.write(item.ip + '\t')
f.write(item.port + '\t')
f.write(item.anonymous + '\t')
f.write(item.local + '\t')
f.write(item.speed + '\n\n')
if __name__ =='__main__':
Get = GetProxy()
实践:爬取b站排行榜信息
'''
selenium模拟浏览器爬虫
爬取b站排行榜信息
'''
from selenium import webdriver
class Item(object):
'''
我们模拟Scrapy框架
写一个item类出来
'''
rank = None #排名
title = None #名
play_num = None #播放量
danmu_num = None #弹幕量
author = None #作者
score = None #综合得分
url = None #链接
class Get(object):
'''
获取代理的类
'''
def __init__(self):
'''
初始化整个类
'''
self.starturl = 'https://www.bilibili.com/ranking'
self.ranklist = self.get_rank_list(self.starturl)
self.filename = 'rank.txt'
self.saveFile(self.filename,self.ranklist)
def get_rank_list(self,url):
'''
返回抓取到代理的列表
整个爬虫的关键
'''
browser = webdriver.Chrome()
rank_list = []
browser.get(url)
browser.implicitly_wait(3)
# 找到代理table的位置
elements = browser.find_elements_by_xpath('//ul[@class="rank-list"]/li[@class="rank-item"]')
for element in elements:
item = Item()
item.rank = element.find_element_by_xpath('./div[@class="num"]').text
item.title = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/a[@class="title"]').text
item.play_num = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span[@class="data-box"][position()=1]').text
item.danmu_num = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span[@class="data-box"][position()=2]').text
item.author = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span[@class="data-box"]').text
item.score = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div').text
item.url = element.find_element_by_xpath('./div[@class="content"]/div[@class="img"]/a').get_attribute('href')
print(item.rank)
rank_list.append(item)
browser.quit()
return rank_list
def saveFile(self,filename,rank_list):
'''
将爬取到的结果写到本地
'''
with open(filename,'w') as f:
for item in rank_list:
f.write('NO.'+item.rank + '\n')
f.write('title:'+item.title + '\n')
f.write('play:'+item.play_num + '\n')
f.write('danmu:'+item.danmu_num + '\n')
f.write('author:'+item.author + '\n')
f.write('score:'+item.score + '\n')
f.write('author:'+item.url + '\n\n')
if __name__ =='__main__':
Get = Get()
坑获取标签属性要用get_attribute(‘’) 还以为爬不了呢