python+selenium从excel读取成语到谷歌搜索得到搜索结论数

今天记录利用selenium从excel中读取内容,将内容输入到谷歌浏览器中,并搜索得到结论数,然后再将结论数写入excel中的案例。
在这里插入图片描述
思路:
1,利用selenium模拟用户操作浏览器,由于是繁体成语,且是在谷歌浏览器中进行搜索,先开启代理,然后将谷歌浏览器默认语言设置为中文繁体(设置->高级->语言),同时在谷歌浏览器的主页,还要将浏览器页面的展示设置为繁体;
在这里插入图片描述
2,设置完之后,关闭Chrome浏览器,进入电脑C:\Users\AppData\Local\Google\Chrome路径下,复制一份User Data命名为User Data1,这样在selenium操作浏览器时调用User Data1的路径,即能保证测试浏览器保持繁体的配置,又不影响本身谷歌浏览器的使用(如果直接使用User Data,又在人工使用谷歌浏览器,会有端口占用的报错)
在这里插入图片描述

opt = webdriver.ChromeOptions()
opt.add_argument(f"--user-data-dir={os.path.expanduser('~')}\\AppData\\Local\\Google\\Chrome\\User Data1")
# 通过--user-data-dir=的方式来使得chromedriver的配置和本地浏览器相同(本地已设置浏览器语言为繁体,需要保留这个配置)
s = Service('chromedriver.exe')
# 将chromedriver.exe放到脚本所在路径下,方便selenium操作浏览器时不影响本地原本浏览器的使用

3,然后就是调用excel表格,读取表格中的成语,然后搜索成语的释义,近义词等,再将这些结果写入新的excel表格:
在这里插入图片描述4,为了防止爬取过程中网络不稳定或者其他原因导致第一次爬取失败,增加了重试机制和断点续传,重试机制为了防止第一遍爬取失败,断点续传用于避免爬取失败后,已爬取过的数据不用再次爬取。具体实现流程见代码注释

全部代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from bs4 import BeautifulSoup
import os
import time

def chrome_search(find_word,isFirst):
	try:
		search_box = browser.find_element(By.NAME,"q")
		search_box.clear()
		# 每次输入成语查询完之后,需要清空一下搜索框
		if isFirst:
			search_box.send_keys(find_word + Keys.ENTER)
			#本来想每次都用ENTER键来搜索,但是貌似ENTER键的方式不是特别推荐,具体原因有空研究后再补充;
		else:
			search_box.send_keys(find_word)
			search_btn = browser.find_element(By.XPATH,"//*[@id="tsf"]/div[1]/div[1]/div[2]/button/div")
			search_btn.click()
			# 这里没有全部用find_element查找搜索按钮的原因是,第一次启动浏览器在Google主页搜索时的搜索按钮不一样,但是由于主页搜索只用到一次,所以单独处理成了+ Keys.ENTER的方式
			time.sleep(1)
			browser.refresh()
			# 由于实际运行过程中,网络不是很稳定,第一遍查询总是未查询到,增加一个刷新步骤,增加页面加载成功率

		WebDriverWait(browser,10).until(EC.presence_of_element_located((By.XPATH,"//div[@id='result-stats']")))
		# 想要页面加载后在页面定位元素,尽量用EC.presence_of_element_located的方法
		# 一开始用的WebDriverWait(browser,10).until(EC.title_contains(find_word)),从标题中去定位,会比较容易在页面还没加载出来的时候,找不到元素而报错
		bsobj = BeautifulSoup(browser.page_source,feature='lxml')
		# 这里改成xpath定位应该更美观,就可以不必用到BeautifulSoup依赖了,但是懒得改了
		count_text = bsobj.find('div',{'id':'result-stats'})
		a1 = count_text.text.split('結果')[0]
		# 用結果分割,丢弃掉后面的(搜尋時間:0.47 秒) 中的数字
		a2 = filter(lamda s:s==',' or s.isdigit(),a1)
		# 匹配结果时,保留页面的结论数表示法,不要漏掉数字间的逗号
		count = (''.join(a2))
		print(count)
		time.sleep(1)
		return count
	except:
		return -1

if __name__ == '__main__':
	opt = webdriver.ChromeOptions()
    opt.add_argument(f"--user-data-dir={os.path.expanduser('~')}\\AppData\\Local\\Google\\Chrome\\User Data1")
    # 通过--user-data-dir=的方式来使得chromedriver的配置和本地浏览器相同(本地已设置浏览器语言为繁体,需要保留这个配置)
    opt.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 通过'enable-automation'的方式,可以在selenium操控浏览器时,去掉顶部的“chrome正受到自动测试软件的控制”字样
    # opt.add_argument("--headless")
    # 无头浏览模式,这样不会打开浏览器去搜索,是最基础的防止被浏览器检测的方法
    opt.add_argument(
        'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36')
    s = Service('chromedriver.exe')
    # 将chromedriver.exe放到脚本所在路径下,方便selenium操作浏览器时不影响本地原本浏览器的使用
    desired_capabilities = DesiredCapabilities.CHROME
    browser = webdriver.Chrome(service=s,option=opt,desired_capabilities=desired_capabilities)
    # desired_capabilities 可以使得get直接返回,不再等待界面加载完成
    browser.get('https://www.google.com.hk/')
    browser.implicitly_wait(10)
    # 隐性等待:在10秒内网页是否加载完成,如果完成了,就进行下一步;如果没有在10秒内加载完成,则会报超时加载。不用强制等待

	init_df = pd.read_excel('t3066.xlsx',usecols=['成语'])
	# 导入脚本所在路径下t3066.xlsx表格,并定义init_df对象
	chengyu_list = list(init_df['成语'])
	isFirst = True
	word_list = ['釋義', '出處', '例句', '近義詞', '反義詞']
	# 将成语后的后缀放在一个list下
	doneList = list()
	# done.txt用于记录已爬取过的词语,已爬取过的成语写入该文件,如果运行失败或者再次运行,通过done.txt进行查询,已经爬取过的词语则不再二次爬取
	with open("done.txt","r+",encoding="utf-8") as f:
		for line in f.readlines():
			doneList.append(line.strip())
	print(doneList)

	for key_word in chengyu_list:
		for back_word in word_list:
			reloadnum = 0
			word_search = key_word + back_word
			# 按照“成语+释义”的方式搜索
			if word_search in doneList:
				continue
			search_count = chrome_search(word_search,isFirst)
			if search_count == -1:
				if reloadnum <= 5:
					search_count = chrome_search(word_search,isFirst)
					reloadnum = reloadnum + 1
					# 失败重试5次,如果5次都失败,则continue跳过该成语继续运行,后面再跑一次查询到该未搜索成功的成语,交给done.txt再次查询一次即可
				continue
			init_df.loc[init_df.成语 == key_word,back_word] = search_count
			isFirst = False
			init_df.to_excel('t3066new.xlsx')
			# 将结果写入新的表格
			with open("done.txt","a+",enconding="utf-8") as f:
			# a+表示追加,才不会覆盖之前的数据
				f.writelines(word_search + "\n")
		browser.quit()
		print('over!')
			
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值