Directly drive the browser to crawl data through selenium

Directly drive the browser to crawl data through selenium

import time
from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素

"""1.创建chrome浏览器控制器,用于搜索网页,但是速度较慢"""
#把下载好的chromedriver.exe放到python安装路径的scripts目录中即可,务必保证chromedriver.exe的版本和浏览器版本一致
browser=webdriver.Chrome()#创建chrome浏览器控制器,


"""2.访问网页并控制网页"""
#wait = WebDriverWait(browser, 10)#显式等待:显式地等待某个元素被加载
browser.implicitly_wait(10)#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.get('https://www.baidu.com/')#浏览器控制器访问网页

html=browser.page_source#直接获取网页源码
browser.get_cookies()#获取cookies

#通过输入框搜索内容
#input_tag = wait.until(EC.presence_of_element_located((By.ID, "kw")))#通过关键字‘kw’获得输入框
input_tag=browser.find_element_by_id('kw')##通过搜索标签id获得输入框
input_tag.send_keys('火影')#往输入框中输入‘火影’
#input_tag.send_keys(Keys.ENTER)#点击搜索‘火影’内容
button=browser.find_element_by_id('su')#获得‘百度一下’的按钮
time.sleep(1)
button.click()#点击‘百度一下’按钮
input_tag.clear()#清空输入框内容


#定位获取网页内容
browser.find_element(By.XPATH,'//*[@id="s_index_off_css"]')#通过XPath获得,配合By.XPATH来使用
browser.find_element_by_id()#直接通过id查找内容
browser.find_element_by_class_name('cr-offset')#通过class查找
browser.find_elements_by_css_selector('#content_left')#通过selector查找
input_tag.get_attribute('class')#获得标签inputFirst的'class'属性
input_tag.text()#获得标签inputFirst的文本内容
input_tag.location#返回标签位置
input_tag.size#返回标签大小

#模拟操作网页
browser.title#打印页面标题“百度一下你就知道”
browser.save_screenshot("baidu.png")#生成当前页面快照
browser.page_source# 打印网页渲染后的源代码
input_tag.send_keys(Keys.CONTROL,'a')#模拟快捷键 ctrl+a 全选输入框内容
input_tag.send_keys(Keys.CONTROL,'x')#模拟快捷键 ctrl+x 剪切输入框内容
input_tag.send_keys(Keys.RETURN)# 模拟Enter回车键
browser.current_url# 获取当前url
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#将页面拉到底部

#切换网页窗口
#browser.execute_script('alert("tank")')#弹窗操作
browser.execute_script('''window.open();''') # 新建浏览器窗口
browser.get('https://www.taobao.com')# 第二个窗口往淘宝发送请求
browser.window_handles# 获取所有的选项卡
browser.switch_to.window(browser.window_handles[1])# 切换到第二个窗口
browser.switch_to.window(browser.window_handles[0])# 切换到第一个窗口
browser.forward()# 前进操作
browser.back() # 回退操作
alert = browser.switch_to_alert()#当页面出现了弹窗提示

time.sleep(3)#程序休眠3秒,防止被发现
browser.close()#关闭当前页面
browser.quit()#关闭浏览器


"""3.模拟人拖拽图片,通过验证码"""
browser=webdriver.Chrome()#创建chrome浏览器控制器,
browser.implicitly_wait(10)#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.get('https://www.cnblogs.com/lweiser/p/11045023.html')#浏览器控制器访问网页

#输入文本并搜索
input=browser.find_element_by_id('q')
input.send_keys('爬虫')
button=browser.find_element_by_id('btnZzk')
button.click()

start_object=browser.find_element_by_xpath('/html/body/div[8]/div[2]/div[6]/div/div[1]/div[2]/div[2]')#寻找需要拖拽的物体
end_object=browser.find_element_by_xpath('/html/body/div[8]/div[2]/div[6]/div/div[1]/div[2]/div[1]/div')#寻找拖拽目标位置

start=start_object.location['x']#定位拖拽物体x坐标位置
end=end_object.location['x']#定位拖拽目标y坐标位置

distance=end-start
ActionChains(browser).click_and_hold(start_object).perform()# 点击并摁住源图片,每个动作都要调用perform执行

s = 0
while s < distance:
    ActionChains(browser).move_by_offset(xoffset=(61.6/distance), yoffset=0).perform()# 执行位移操作
    s += 1
ActionChains(browser).release().perform()## 释放动作链


"""4.模拟鼠标动作"""
#from selenium.webdriver.common.keys import Keys# 要想调用键盘按键操作需要引入keys包
#from selenium.webdriver import ActionChains

browser=webdriver.Chrome()#创建chrome浏览器控制器,
browser.implicitly_wait(10)#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.get('https://www.cnblogs.com/lweiser/p/11045023.html')#浏览器控制器访问网页

location=browser.find_element_by_xpath('//*[@id="blog_nav_myhome"]')#目标位置
ActionChains(browser).move_to_element(location).perform()#鼠标移动到此处
ActionChains(browser).move_to_element(location).click(location).perform()#鼠标移动到某处单击
ActionChains(browser).move_to_element(location).double_click(location).perform()#鼠标移动到某处双击
ActionChains(browser).move_to_element(location).context_click(location).perform()#鼠标移动到某处右击


"""5.模拟选择下拉框"""
from selenium.webdriver.support.ui import Select
browser=webdriver.Chrome()#创建chrome浏览器控制器,
browser.implicitly_wait(10)#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.get('https://www.163.com/')#浏览器控制器访问网页

select = Select(browser.find_element_by_name('status'))
select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u"xxx")
select.deselect_all()#全部取消方法


"""6.模拟登录"""
browser=webdriver.Chrome()#创建chrome浏览器控制器,
browser.implicitly_wait(10)#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.get('https://qzone.qq.com/')#浏览器控制器访问网页

acount=browser.find_element_by_xpath('//*[@id="u"]')#账号输入框
code=browser.find_element_by_xpath('//*[@id="txtToken"]')#密码输入框
again_code=browser.find_element_by_xpath('//*[@id="txtValidCode"]')#验证码输入框
login=browser.find_element_by_xpath('//*[@id="lnkLogin"]')#登录键

acount.send_keys('jrys19120500')#输入账号
code.send_keys('181818')#输入密码
again_code.send_keys('7I4I')#输入验证码
login.click()#点击登录键

#通过点击竞赛入口进入竞赛
open_come=browser.find_element_by_xpath('//*[@id="form1"]/div[3]/div[2]/div[1]/div[2]/div[2]/table/tbody/tr/td[7]/div/a')
open_come.click()
html=browser.page_source
print(html)

"""7.以无界面形式打开:不打开网页"""
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from selenium.webdriver.common.keys import Keys
import os
import urllib.request
os.chdir('F:\python工作环境\python\代码运行文件夹\学习笔记\网络爬虫')

#创建一个参数对象,用来控制chrome以无界面模式打开
ch_op = Options()
#设置谷歌浏览器的页面无可视化
ch_op.add_argument('--headless')
ch_op.add_argument('--disable-gpu')
ch_op.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度

browser = webdriver.Chrome(chrome_options=ch_op)#创建chrome浏览器控制器,
browser.implicitly_wait(10)#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.get('https://www.baidu.com/')#浏览器控制器访问网页
browser.save_screenshot("baidu2.png")
time.sleep(2)

input=browser.find_element_by_xpath('//*[@id="kw"]')
input.send_keys('火影')
input.send_keys(Keys.ENTER)

picture=browser.find_element_by_xpath('//*[@id="s_tab"]/div/a[3]')
picture.click()
#将页面向下连续拉10次,从而获取更多图片
for i in range(10):
    browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#将页面拉到底部


"""8.下载图片"""
image_url='http://img.jf258.com/i/5a3963067791x3741032184b27.jpg'#寻找图片所在地址,以.jpg结尾
path='F:\python工作环境\python\代码运行文件夹\学习笔记\网络爬虫\图片'#图片保存目录
name='one'#图片名称

res=urllib.request.urlopen(image_url,timeout=5).read()#将图片读写为二进制形式
with open(path + name + '.jpg', 'wb') as file:#将图片保存为jpg格式
    file.write(res)
    file.close()

"""9.XPath的使用:用于定位网页节点,解析无法直接下载的网页源码"""
"""
表达式	描述
nodename	选取此节点的所有子节点
/	从当前节点选区直接子节点
//	从当前节点选取子孙节点
.	选取当前节点
..	选取当前节点的父节点
@	选取属性
使用a/li//text()可以直接获取li中的文本

如://title[@lang='eng']
这是一个 XPath 规则,代表的是选择所有名称为 title,同时属性 lang 的值为 eng 的节点,后面会通过 Python 的 lxml 库,利用 XPath 进行 HTML 的解析。
"""
from selenium import webdriver  # 导入selenium自动化测试模块
from lxml import html  # 导入xpath解析模块
import time # 导入时间模块
import requests # 导入爬虫request模块
import random # 随机生成数字模块
etree = html.etree # 实例化etree

browser = webdriver.Chrome('chromedriver.exe') # 实例化selenium模块
url = 'https://image.baidu.com/' # 获取要访问的url
browser.get(url) # 进行访问

input_box = browser.find_element_by_id('kw') # 获取该输入框
input_box.send_keys('火影') # 输入数据
time.sleep(3) # 延迟3秒

input_click = browser.find_element_by_class_name('s_search') # 获取搜索按钮
input_click.click() # 点击按钮
time.sleep(3) # 延迟三秒

#将页面向下拉动,以获取更多图片
for i in range(3): # 进行滑动加载数据使用js代码
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    time.sleep(2)

text_s = browser.page_source # 将获取的页面转化成text类型
print(text_s)#此时仍就是不包含信息的代码
time.sleep(5) # 延迟5秒

#通过xpath将代码文本转化为包含信息的字符串
tree = etree.HTML(text_s) # 实例化xpath
text_url = tree.xpath('//div[@class="imgpage"]/ul/li') # 进行第一次解析,获取
#'//div[@class="imgpage"]/ul/li' //表示获取子孙节点,//div[@class="imgpage"]/ul/li表示获取属性class="imgpage"的div下面路径的/ul/li下面的所有子孙节点
#text_url = tree.xpath('//ul[@class="imglist clearfix pageNum0"]/li')也可以定位所有的 li 标签
for i in text_url: # 因li标签为多条 进行遍历
    #i=text_url[6]
    img_link = i.xpath("./div/a/img/@data-imgurl")[0] # 进行第二次解析,获取路径 ./div/a/img/ 下的@data-imgurl中的信息,即图片网址,结尾以.jpg结尾
    # img_link = i.xpath("div/a/@href")[0] 可以获得div/a中的href属性内容
    if 'https' in img_link: # 判断数据里面有没有‘https’
        pass
    else:
        img = img_link.replace('http','https') # 如果数据为http所以换成https
    headers = {
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
    img_url = requests.get(url=img_link,headers=headers) # 通过图片所在网址直接下载图片
    with open('./link/%s.jpg'%random.randint(1,1000),'wb')as f:  # 写入数据,随机生成文件名
        f.write(img_url.content) # 因为是图片所以为二进制流(content)









Guess you like

Origin blog.csdn.net/weixin_45590329/article/details/106358323
Recommended