chromedriver设置无界面模式 selenium基础操作

chromedriver设置无界面模式

from selenium import webdriver

options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
browser.get('http://www.baidu.com/')
browser.save_screenshot('baidu.png')

selenium - 键盘操作

from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')
# 1、在搜索框中输入"selenium"
browser.find_element_by_id('kw').send_keys('赵丽颖')
# 2、输入空格
browser.find_element_by_id('kw').send_keys(Keys.SPACE)
# 3、Ctrl+a 模拟全选
browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
# 4、Ctrl+c 模拟复制
browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c')
# 5、Ctrl+v 模拟粘贴
browser.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')
# 6、输入回车,代替 搜索 按钮
browser.find_element_by_id('kw').send_keys(Keys.ENTER)

selenium - 鼠标操作

from selenium import webdriver
# 导入鼠标事件类
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
#输入selenium 搜索
driver.find_element_by_id('kw').send_keys('赵丽颖')
driver.find_element_by_id('su').click()

#移动到 设置,perform()是真正执行操作,必须有
element = driver.find_element_by_name('tj_settingicon')
ActionChains(driver).move_to_element(element).perform()

#单击,弹出的Ajax元素,根据链接节点的文本内容查找
driver.find_element_by_link_text('高级搜索').click()

selenium - 切换页面

适用网站

  页面中点开链接出现新的页面,但是浏览器对象browser还是之前页面的对象

应对方案

# 获取当前所有句柄(窗口)
all_handles = browser.window_handles
# 切换browser到新的窗口,获取新窗口的对象
browser.switch_to.window(all_handles[1])

民政部网站案例

目标

  将民政区划代码爬取到数据库中,按照层级关系(分表 -- 省表、市表、县表)

数据库中建表

# 建库
create database govdb charset utf8;
use govdb;
# 建表
create table province(
    p_name varchar(20),
    p_code varchar(20)
    )charset=utf8;
create table city(
    c_name varchar(20),
    c_code varchar(20),
    c_father_code varchar(20)
    )charset=utf8;
create table county(
    x_name varchar(20),
    x_code varchar(20),
    x_father_code varchar(20)
    )charset=utf8;

思路

1、selenium+Chrome打开一级页面,并提取二级页面最新链接
2、增量爬取: 和数据库version表中进行比对,确定之前是否爬过(是否有更新)
3、如果没有更新,直接提示用户,无须继续爬取
4、如果有更新,则删除之前表中数据,重新爬取并插入数据库表
5、最终完成后: 断开数据库连接,关闭浏览器

代码实现

from selenium import webdriver
import pymysql


class GovSpider(object):
  def __init__(self):
    #设置无界面
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    self.browser = webdriver.Chrome(options=options)
    self.one_url = 'http://www.mca.gov.cn/article/sj/xzqh/2019/'
    self.db = pymysql.connect(
      'localhost', 'root', '123456', 'govdb', charset='utf8'
    )
    self.cursor = self.db.cursor()
    # 创建3个列表,用executemany()往3张表中插入记录
    self.province_list = []
    self.city_list = []
    self.county_list = []

  def get_incr_url(self):
    self.browser.get(self.one_url)
    # 提取最新链接,判断是否需要增量爬
    td = self.browser.find_element_by_xpath(
      '//td[@class="arlisttd"]/a[contains(@title,"代码")]'
    )
    # 提取链接 和 数据库中做比对,确定是否需要怎俩那个抓取
    # get_attribute()会自动补全提取的链接
    two_url = td.get_attribute('href')
    sel = 'select url from version where url=%s'
    # result为返回的受影响的条数
    result = self.cursor.execute(sel, [two_url])
    if result:
      print('无须爬取')
    else:
      td.click()
      # 切换句柄
      all_handlers = self.browser.window_handles
      self.browser.switch_to.window(all_handlers[1])
      self.get_data()
      # 把URL地址存入version表
      dele = 'delete from version'
      ins = 'insert into version values(%s)'
      self.cursor.execute(dele)
      self.cursor.execute(ins, [two_url])
      self.db.commit()

  def get_data(self):
    tr_list = self.browser.find_elements_by_xpath(
      '//tr[@height="19"]'
    )
    for tr in tr_list:
      code = tr.find_element_by_xpath('./td[2]').text.strip()
      name = tr.find_element_by_xpath('./td[3]').text.strip()
      print(code, name)
      # 数据添加到对应的表中
      if code[-4:] == '0000':
        self.province_list.append([name, code])
        if name in ['北京市', '天津市', '上海市', '重庆市']:
          self.city_list.append([name, code, code])
      elif code[-2:] == '00':
        self.city_list.append([name, code, (code[:2])])
      else:
        if code[:2] in ['11', '12', '31', '50']:
          self.county_list.append([name, code, (code[:2] + '0000')])
        else:
          self.county_list.append([name, code, (code[:4] + '00')])
    # 执行数据库插入语句
    self.insert_mysql()

  def insert_mysql(self):
    # 1.删除
    del_province = 'delete from province'
    del_city = 'delete from city'
    del_county = 'delete from county'
    self.cursor.execute(del_province)
    self.cursor.execute(del_city)
    self.cursor.execute(del_county)
    # 2.插入
    ins_province = 'insert into province values(%s,%s)'
    ins_city = 'insert into city values(%s,%s,%s)'
    ins_county = 'insert into county values(%s,%s,%s)'
    self.cursor.executemany(ins_province, self.province_list)
    self.cursor.executemany(ins_city, self.city_list)
    self.cursor.executemany(ins_county, self.county_list)
    self.db.commit()
    print('数据抓取完成,成功存入数据库')

  def main(self):
    self.get_incr_url()
    self.cursor.close()
    self.db.close()
    self.browser.quit()


if __name__ == '__main__':
  spider = GovSpider()
  spider.main()
代码实现

selenium - Web客户端验证

弹窗中的用户名和密码如何输入?

  不用输入,在URL地址中填入就可以

示例: 爬取某一天笔记

from selenium import webdriver

url = 'http://tarenacode:code_2013@code.tarena.com.cn/AIDCode/aid1904/15-spider/spider_day06_note.zip'
browser = webdriver.Chrome()
browser.get(url)

 

 

posted @ 2019-08-16 19:55  maplethefox  阅读(6776)  评论(1编辑  收藏  举报