本文使用python+selenium模拟百度搜索关键词,并根据需要点击自己想要的链接(会自动翻页)。
废话不多说,直接上代码
# coding=utf-8 from selenium import webdriver import requests,time,re import fake_useragent from selenium.webdriver.support.ui import WebDriverWait class Viewer: driver_path = "d:/chromedriver.exe" #定义浏览器驱动的位置 final_url = None def __init__(self,kw,title): self.bdurl = "https://www.baidu.com/s?wd=" self.bdurl_base = "https://www.baidu.com/" self.kw = kw self.title = title self.ua=fake_useragent.UserAgent() #将request请求返回的cookie转为字符串或者字典形式,默认转为字符串形式 def handleRequestCookie(self,cookies,type=0): cookies_dict = cookies.get_dict() if type==0: result = "" for index in cookies_dict: result = result+"%s=%s; " % (index,cookies_dict[index]) else: result = cookies_dict return result #先访问百度首页,获取其cookie,再用这个cookie去访问搜索页,这是为了防百度的验证,如果搜索多了就会出现这个验证 def getBaiduCookie(self): headers = {"User-Agent":self.ua.random} r = requests.get(self.bdurl_base,headers=headers) self.bdCookies = r.cookies #初始化浏览器 def init_chrome(self): opt = webdriver.ChromeOptions() prefs = {"profile.managed_default_content_settings.images": 2} # 无图模式 opt.add_experimental_option("prefs",prefs) opt.add_argument("user-agent="+self.ua.random) #添加随机user-agent driver = webdriver.Chrome(executable_path=self.driver_path,chrome_options=opt) self.driver = driver # 处理每页获取到的百度搜索,并处理掉里面的html,匹配self.title def matchTitle(self,items): self.lastItems = items for i,item in zip(range(len(items)),items): # 获取每个节点的html,去除里面的标签 html = item.get_attribute("innerHTML") html = re.sub("</?[^<>]+>","",html) print(html) if html.find(self.title)!=-1: return i return False # 搜索关键词 def search(self): self.driver.implicitly_wait(10) # 设置10秒的隐性等待时间 self.driver.get(self.bdurl_base) self.driver.find_element_by_xpath("//input[@id='kw']").send_keys(self.kw) self.driver.find_element_by_xpath("//input[@id='su']").click() # 获取每一页的每一条的内容,如果在这一条内容上找到self.title的内容,就获取他的下标 items = self.driver.find_elements_by_xpath("//h3[contains(@class,'t')]/a") # print(items) click_index = self.matchTitle(items) if click_index is False: #如果没有找到self.title的内容,就点击下一页重复上面的过程 while click_index is False: # is相当于python中的全等于 #点击下方分页的下一页,如果没有则跳出 try: self.driver.find_element_by_xpath("//div[@id='page']/strong/following-sibling::*[1]").click() # time.sleep(2) WebDriverWait(self.driver, 10, 0.5).until(lambda driver:self.driver.find_elements_by_xpath("//h3[contains(@class,'t')]/a") and self.lastItems!=self.driver.find_elements_by_xpath("//h3[contains(@class,'t')]/a")) items = self.driver.find_elements_by_xpath("//h3[contains(@class,'t')]/a") click_index = self.matchTitle(items) if click_index is not False: items[click_index].click() #找到则点击链接,并停留1分钟 time.sleep(60) self.final_url = self.driver.current_url # self.driver.quit() self.res=True # 最终结果,直接在类外部用对象.res查看最终结果 except BaseException as e: self.res=False break else: self.final_url = self.driver.current_url self.res = True # 最终结果,直接在类外部用对象.res查看最终结果 self.driver.quit() #关闭浏览器 # 执行搜索,并翻页,找到self.title之后直接点击进去 def run(self): # 初始化浏览器 self.init_chrome() # 请求百度首页,并且输入title,点击搜索 self.search() if __name__=="__main__": # 搜索php教程这个关键词,要点击指定的title的链接,如果这个title在百度没有排名则点击不到 viewer = Viewer(kw="php教程",title="张柏沛的个人IT技术博客-专注和分享PHP建站和Python技术的学习博客") viewer.run() print(viewer.res) print(viewer.final_url)
如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息
张柏沛IT技术博客 > python+selenium模拟百度搜索并点击链接
点击复制转载该篇文章