案例:糗事百科 selenlum基本使用-操作表单元素,行为链,键盘操作

案例:爬取糗事百科

爬点笑话开心开心。。。

import requests,csv,threading,queue
from lxml import etree

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36','Referer': 'https://www.qiushibaike.com/text/'}

class Producer(threading.Thread):
    def __init__(self,data_queue,save_queue):
        self.data_queue = data_queue
        self.save_queue = save_queue
        super().__init__()
    def run(self):
        while not self.data_queue.empty():
            url = self.data_queue.get()
            resp = requests.get(url,headers=headers)
            text = resp.content.decode()
            html = etree.HTML(text)
            data = html.xpath('/html/body/div[2]/div/div[2]/div[1]/a/div/span/text()|//div[@class="article block untagged mb15 typs_hot"]/a[1]/div/span/text()')
            for each in data:
                each = each+'\n'
                self.save_queue.put(each)


class Consumer(threading.Thread):
    def __init__(self,save_queue):
        self.save_queue = save_queue
        super().__init__()
    def run(self):
        with open('hhh.txt','a',encoding='utf-8') as f:
            while not self.save_queue.empty():
                f.write(self.save_queue.get(block=False))

def main():
    data_queue = queue.Queue(100)
    save_queue = queue.Queue(1000)
    for i in range(1,5):
        url = 'https://www.qiushibaike.com/text/page/{}/'.format(i)
        data_queue.put(url)
    for x in range(5):
        th = Producer(data_queue,save_queue)
        th.start()
    for x in range(5):
        th = Consumer(save_queue)
        th.start()

if __name__ == '__main__':
    main()

Selenium的基本使用-操作表单元素

表单元素:输入框,按钮啊,下次自动登录啊这类的。。详细的百度吧。。。

  1. 操作输入框:找到这个元素,然后使用send_keys( value),将数据填进去。

  2. 操作checkbox:因为要选中checkbox标签,在网页中是通过鼠标点击的,因此想要选中checkbox标签,先选中这个标签,在执行click。a=driver.find_element_by_name('button;) a.click checkbox就是那种下次自动登录这类的按钮。。

  3. 选择select:select元素不能直接点击。因为点击后还要选中元素,使用类selenium.webdriver.support.ui.Select,将获取到的元素当成参数传到这个类中,创建这个类的对象,以后就可以使用这个对象进行选择了。。。。。。

from selenium import webdriver

driver = webdriver.Chrome()  

driver.get('https://www.zhihu.com/signin?next=%2F') # 知乎登录界面
username = driver.find_element_by_name('username')
username.send_keys('哈哈哈哈哈哈哈哈哈哈哈')     # 自动输入账号
password = driver.find_element_by_name('digits')
password.send_keys('哈哈哈哈哈哈')                # 自动输入验证码
butten = driver.find_element_by_class_name('SignFlow-submitButton')
butten.click()             # 点击登录按钮


# 豆瓣网站相关的测试代码,主要用来验证checkbox的:
# 在原网页是找不到remember这个按钮的,他在iframe标签下,整个登录框是另一个网页加载进来的。。。网页就是跟在后面那个
driver.get("https://accounts.douban.com/passport/login_popup?login_source=anony") 
checkbox = driver.find_element_by_name("remember")
checkbox.click()


# 南昌航空大学测试代码,主要用来验证select的:
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
driver.get("http://www.nchu.edu.cn/")

select = Select(driver.find_element(By.ID,"ContentPlaceHolder1_dpLinkList"))    # 这个效果跟by_id一样,就是需要格外导入
# 要经过Select 包装的啊,,,,
select.select_by_index(1)  # 通过索引值来选择第二个链接

select.select_by_value("http://secp.jxedu.gov.cn/portal/index")     # 通过值来跳转

select.select_by_visible_text("东航优惠机票1")           # 通过可见文本来选择

基本使用-行为链

有时候在页面的操作可能要很多步,那么这时候可以使用鼠标行为链类。。

selenium.webdriver.common.action_chains.ActionChains

比如将鼠标移动到某个元素进行点击,,,,

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()

driver.get("https://www.zhihu.com/signin?next=%2F")   # 又是知乎。。。

actions = ActionChains(driver)                       # 注意包装
usernameTag = driver.find_element_by_name("username")    # 获取相关元素,账号,验证码输入框,和登录按钮
digitsTag = driver.find_element_by_name("digits")
submitBtn = driver.find_element_by_class_name("SignFlow-submitButton")

actions.move_to_element(usernameTag)          # 移动鼠标到账号框
actions.send_keys_to_element(usernameTag,"哈哈哈哈哈")  # 输入账号
actions.move_to_element(digitsTag)
actions.send_keys_to_element(digitsTag,"6666666")
actions.move_to_element(submitBtn)
actions.click(submitBtn)         # 点击登录按钮

actions.perform()             # 让行为链执行。。。真成精了。。。。

更能模仿人的行为,防止被网站干掉。。。

  • click(on_element=None) ——单击鼠标左键
  • click_and_hold(on_element=None) ——点击鼠标左键,不松开
  • context_click(on_element=None) ——点击鼠标右键
  • double_click(on_element=None) ——双击鼠标左键
  • drag_and_drop(source, target) ——拖拽到某个元素然后松开
  • drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
  • key_down(value, element=None) ——按下某个键盘上的键
  • key_up(value, element=None) ——松开某个键
  • move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
  • move_to_element(to_element) ——鼠标移动到某个元素
  • move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
  • perform() ——执行链中的所有动作
  • release(on_element=None) ——在某个元素位置松开鼠标左键
  • send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
  • send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

更多方法参考脑部链接。。。。你不会想看的。。。。。

键盘操作

selenium.webdriver.common.keys.Keys

selenium提供一个keys包来模拟所有的按键操作,下面是一些常用的按键操作 ,有时候使用键盘操作可以省去很多步骤:

  • 回车键:Keys.ENTER
  • 删除键:Keys.BACK_SPACE
  • 空格键:Keys.SPACE
  • 制表键:Keys.TAB
  • 回退键:Keys.ESCAPE
  • 刷新键:Keys.F5
  • 全选(ctrl+A):send_keys(Keys.CONTROL,‘a’) #组合键需要用send_keys方法操作
  • 复制(ctrl+C):send_keys(Keys.CONTROL,‘c’)
  • 剪切(ctrl+X):send_keys(Keys.CONTROL,‘x’)
  • 粘贴(ctrl+V):send_keys(Keys.CONTROL,‘v’)
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

driver=webdriver.Chrome()
driver.get('https://pypi.org/')

element=driver.find_element_by_id('search')  #获取输入框
element.send_keys('selenium')  #搜索selenium包
element.send_keys(Keys.ENTER)  #按回车键
element_a = driver.find_element_by_xpath('//*[@id="content"]/section/div/div[2]/form/section[2]/ul/li[1]/a/h3/span[1]')#定位selenium包链接
ActionChains(driver).move_to_element(element_a).click(element_a).perform() #按左键点击链接执行

element_down=driver.find_element_by_link_text('Download files')  #定位下载链接
ActionChains(driver).move_to_element(element_down).click(element_down).perform()  #按左键点击链接

element_selenium=driver.find_element_by_link_text('selenium-3.13.0.tar.gz')  #定位元素selenium下载包链接
data=element_selenium.get_attribute('href')   #获取链接地址
with open('selenium-3.13.0.tar.gz','wb') as f:
    source=requests.get(data).content   #请求下载链接地址获取二进制包数据
    f.write(source)  #写入数据
    f.close()
    
driver.quit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值