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)