网站爬取(如何使用Selenium访问爱奇艺网站并爬取电影信息)

一、使用Selenium访问爱奇艺网站Selenium 是一种常用的自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,还可以通过录制,快速生成脚本。Selenium 支持多种主流的开发语言,比如Ruby,java,python,javascript。环境搭建python3.7.3运行 pip install Selenium 就可以直接下载最新的selenium版本准备浏览器:chrome 70.0.3538.77操作系统:win7Selenium版本: 3.14.1chromedriver: https://npm.taobao.org/mirrors/chromedriver/70.0.3538.97/打开和关闭浏览器使用Selenium 打开和关闭浏览器from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.iqiyi.com/")driver.quit()定位搜索框search_xpath=r"//*[@id='nav_searchboxIn']/input"driver.find_element_by_xpath(search_xpath).send_keys("复仇者联盟")点击搜索图片search_button=r"//*[@id='nav_searchboxOut']/span"driver.find_element_by_xpath(search_button).click()切换tab页#导入键盘操作–20190528更新from selenium.webdriver.common.keys import Keys#此处通过键盘操作切换tab页driver.find_element_by_tag_name("body").send_keys(Keys.CONTROL + "t")#all_handles 保存所有已经打开的tab窗体all_handles = driver.window_handlesprint(driver.window_handles)index_handle=driver.current_window_handleprint(index_handle)#用switch_to方法切换到tab窗体for handle in all_handles:if handle!=index_handle:print('now is search window')search_handle = handledriver.switch_to.window(search_handle)打印页面的title并截图print(driver.title)driver.get_screenshot_as_file("aqiyi.png") 二、使用Selenium爬取爱奇艺电影信息爬取目标爬取目标:每个电影的评分、名称、时长、主演、和类型爬取思路源文件:(有注释)from selenium import webdriverfrom threading import Threadimport threadingimport timeimport openpyxl #操作excel#爱奇艺的看电影的url 不是首页。url='http://list.iqiyi.com/www/1/-8————11-1-1-iqiyi–.html'#自定义一个线程类 实现多线程爬取class M_Thread(Thread):def __init__(self,name1,url):Thread.__init__(self)self.url=urlself.name1=name1def run(self):self.kind_movie=page(self.name1,self.url)#page运行完后lock进行 让 当前movie 结束# 初始化爬虫,从url中爬爬取各个种类相对于的连接。def init():# 浏览器 无界面 和有界面。fireFoxOptions = webdriver.FirefoxOptions()fireFoxOptions.set_headless()Brower = webdriver.Firefox(firefox_options=fireFoxOptions)# Brower = webdriver.Firefox()Brower.get(url)#定位到种类标签 (发现不用Xpath容易出错)kind=Brower.find_element_by_xpath("/html/body/div[3]/div/div/div[1]/div[4]/ul")#a标签就是那个 连接kinds=kind.find_elements_by_tag_name("a")#将每个类型的页面连接储存到kinds_dict中movie_kind_link={}for a in kinds:try:if(a.text=="全部" or a.text==""): #去掉 全部类型 和一个空类型。continuemovie_kind_link[a.text] = a.get_attribute("href")except:print("error!")continueBrower.close()return movie_kind_link #返回的是 种类:url 字典。def page(name,link):#每一个种类 都打开一个excle储存wordbook=openpyxl.Workbook()sheet1=wordbook.activenum=1#初始化excle第一行for qwe in ["电影名","时长","评分","类型","演员"]:sheet1.cell(row=1,column=num,value=qwe)num+=1num=2#本来一开始是用txt写的但是布局太丑。优点是速度快!# 采用过 用数据库存 ,但是同时写入大量数据 总是会出莫名奇妙的错误。暂时没解决# file=open(name+".txt","w",encoding="utf-8")fireFoxOptions = webdriver.FirefoxOptions()fireFoxOptions.set_headless()Br = webdriver.Firefox(firefox_options=fireFoxOptions)# Br = webdriver.Firefox()# try:Br.get(link)print("正在打开 %s 页面"%name)page = Br.find_element_by_class_name("mod-page")page_href=[]for aa in page.find_elements_by_tag_name("a"):page_href.append(aa.get_attribute("href"))for cc in page_href:print("*****正在爬取 {} 的第 {} 页*****".format(name,page_href.index(cc)+1))# time.sleep(1)# 第一页不用重新打开if(page_href.index(cc)!=0):Br.get(cc)#movie 即当前页面的 电影tag 列表movie=Br.find_element_by_class_name("wrapper-piclist").find_elements_by_tag_name("li")for bb in movie:# try:things=bb.text.split("\n")"""这里为什么要区分?爱奇艺很垃圾,有点电影评分不给,但是在直接获取text在if判断和分元素去获取四个属性,我觉得还是if好用。"""if(len(things)==4):sheet1.cell(row=num, column=1, value=things[2])sheet1.cell(row=num, column=2, value=things[0])sheet1.cell(row=num, column=3, value=things[1])sheet1.cell(row=num, column=4, value=name)sheet1.cell(row=num, column=5, value=things[3])num+=1elif (len(things) == 3):sheet1.cell(row=num, column=1, value=things[1])sheet1.cell(row=num, column=2, value="*")sheet1.cell(row=num, column=3, value=things[0])sheet1.cell(row=num, column=4, value=name)sheet1.cell(row=num, column=5, value=things[2])num +=1else:print("error (moive)")# breakLock_thread.release() # 解锁wordbook.save(name+".xlsx")Br.close()if __name__=="__main__":#控制线程最大数量为3Lock_thread= threading.Semaphore(3) #控制线程数为3#kind:linkdict=init()# print(dict)#多线程爬取for name1,link in dict.items():Lock_thread.acquire() #枷锁 ,在每一个page()运行完后解锁thread_live=M_Thread(name1,link)print(name1," begin")thread_live.start()time.sleep(3)总结以上主要介绍了自动化工具Selenium的基本使用,如何对页面元素进行基本操作,实现自动抓取关键字图片功能,以及如何使用Selenium 多线程爬取爱奇艺电影信息,希望能对大家有所帮助。

本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://kuaisubeian.cc/43475.html

kuaisubeian