selenium自动化测试web

来源:互联网 发布:广州天拓网络 编辑:程序博客网 时间:2024/04/28 17:49

  • 爬取没有JS的网页
  • 爬取有JS代码的网页

源码地址
我这里使用selenium是为了爬取网页上的信息,爬取网页上的东西我这边暂且认为有两种方式,一种是针对没有JS的网页,这种情况用普通的get请求就可以爬;另一种是有JS的网页,这种如果不使用支持JS的框架,那么拿到的只是JS代码,所以这里就可以借助selenium这种本意为自动化测试而生的框架。

爬取没有JS的网页

可以用普通的get请求,拿到数据为网页的源代码,用正则表达式去匹配我们想要的东西。
也可以借助框架BeautifulSoup来解析网页源码(XML解析)
正则表达式爬取数据

# user/bin/env python3# -*- coding:utf-8 -*-from urllib import requestimport re# get网络请求def getNetResquest(url):    with request.urlopen(url) as f:        data = f.read()        return dataclass Spider:    def __init__(self):        self.siteURL = 'http://mm.taobao.com/json/request_top_list.htm'  # 淘宝MM网页的URL    # 获取该页的网页数据    def getPage(self, pageIndex):        url = self.siteURL + "?page=" + str(pageIndex)        print(url)        response = getNetResquest(url)        return response.decode('gbk')    # 获取第几页的网页MM    def getContents(self, pageIndex):        page = self.getPage(pageIndex)  # 获取到网页源码数据        pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>', re.S)  # 正则表达式,匹配我们想要的信息这里分别获取到MM的个人主页,头像的链接,姓名,年龄,城市        items = re.findall(pattern, page)  # 用正则表达式,去匹配网页源码        for item in items:  # 遍历匹配的结果,并打印出来            print(item[0], item[1], item[2], item[3], item[4])  # 分别对应MM的个人主页,头像的链接,姓名,年龄,城市spider = Spider()spider.getContents(1)

用bs4分析网页源码爬取数据

import requestsfrom bs4 import BeautifulSoupindex = 0headers = {'referer': 'http://jandan.net/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'}# 保存图片def save_jpg(res_url):    global index    html = BeautifulSoup(requests.get(res_url, headers=headers).text)  # 获取网页数据,并将其转换为beautifulsoup对象    for link in html.find_all('a', {'class': 'view_img_link'}):  # 从网页源码里面抓取图片的链接        with open('{}.{}'.format(index, link.get('href')[len(link.get('href'))-3: len(link.get('href'))]), 'wb') as jpg:  # 抓取链接里面图片的后缀,并新建新的图片文件            jpg.write(requests.get("http:" + link.get('href')).content)  # 将图片保存在本地        print("正在抓取第%s条数据" % index)        index += 1#  抓取煎蛋妹子图片,默认抓取5页if __name__ == '__main__':    url = 'http://jandan.net/ooxx'    for i in range(0, 5):        save_jpg(url)  # 下载图片        url = BeautifulSoup(requests.get(url, headers=headers).text).find('a', {'class': 'previous-comment-page'}).get('href')  # 获取下一页的URL

爬取有JS代码的网页

这里使用selenium框架+Chrome浏览器。
首先需要配置我们的环境变量以及下载会用到的包

pip install selenium selenium Github地址

然后下载chromedriver注意的问题是chromedriver和Chrome的版本一定要相符,一般来说都是用最新的版本是没问题的,一般chromedriver也会说明支持的Chrome版本范围,
下载完成后,将chromedriver解压后的EXE文件复制到Chrome的目录下,如果在安装Chrome时没有另选路径的一般会是下面路径(这里的C作为系统盘)

C:\Users\DAMNICOMNIPLUSVIC\AppData\Local\Google\Chrome\Application
然后把该路径下面的chromedriver添加到环境变量的path里。
win+R->右键此电脑(计算机)->属性->高级系统设置->环境变量->编辑系统变量里面的path,添加
C:\Users\DAMNICOMNIPLUSVIC\AppData\Local\Google\Chrome\Application\;
然后在DOS窗口输入chromedriver看是否有打印信息。
然后写我们的Python代码

# user/bin/env python3# -*- coding:utf-8 -*-import osimport tracebackimport requestsimport sysfrom selenium import webdriverCURRENTPATH = os.path.split(os.path.realpath(sys.argv[0]))[0]  # 获取该文件的绝对路径# 根据提供的网址下载文件def downloadImageFile(imgUrl):    local_filename = imgUrl.split('/')[-1]  # 读取文件的名字    print("Download Image File=", local_filename)    r = requests.get(imgUrl, stream=True)  # here we need to set stream = True parameter    os.makedirs(CURRENTPATH+'\\tuchong', exist_ok=True)  # 创建一个新的文件夹    with open(CURRENTPATH+'\\tuchong\\'+local_filename, 'wb') as f:        for chunk in r.iter_content(chunk_size=1024):            if chunk:  # filter out keep-alive new chunks                f.write(chunk)                f.flush()        f.close()    return local_filenameclass Spider:    def __init__(self):        self.driver = webdriver.Chrome()  # 初始化这个类,这里仅仅指明了用哪个浏览器    def execute(self):        self.login()  # 登录图虫        self.album('3')  # 去到编号为3这个人的相册    def login(self):        self.driver.get('https://tuchong.com/')  # 打开图虫网页        print(self.driver.title)        # login = self.driver.find_element_by_link_text('登录')        login = self.driver.find_element_by_xpath('/html/body/header/nav/div[2]/a[1]')  # 找到图虫首页上面的登录按钮,这里采用的是xpath方式        print(login)        if not login is None:  # 判断找到的登录按钮是否为空            login.click()  # 点击登录按钮            self.driver.switch_to.alert  # 将当前driver的焦点转移到弹出的对话框            account = self.driver.find_element_by_xpath('//*[@id="login-dialog"]/div/div/div/div[1]/form/div[2]/input')  # 找到输入账号的输入框            password = self.driver.find_element_by_xpath('//*[@id="login-dialog"]/div/div/div/div[1]/form/div[3]/input')  # 找到输入密码的输入框            loginbtn = self.driver.find_element_by_xpath('//*[@id="login-dialog"]/div/div/div/div[1]/form/div[6]/button')  # 找到登录的按钮            account.send_keys('你的图虫账号')  # 输入账号            password.send_keys('你的图虫账号密码')  # 输入密码            loginbtn.click()  # 点击登录            self.driver.refresh()  # 刷新driver,让网页本身获取焦点            print(self.driver.title)  # 打印标题    def album(self, num):        url = 'https://tuchong.com/%s/albums' % (str(num),)  # 输入ID为num的账户的相册URL(因为上面已经登录了,所以这里不会要求重新登录)        self.driver.get(url)        self.driver.refresh()  # 刷新driver获取当前网页的焦点        print(self.driver.title)  # 打印当前网页的标题        albums = self.driver.find_elements_by_class_name('picture-wrap')  # 找到用户的相册元素的集合(多个相册就有多个元素)        if True:            try:                albums[2].click()  # 这里点击第三个相册                self.driver.refresh()  # 获取当前页面的driver                images = self.driver.find_elements_by_class_name('post-cover')  # 获取相册里面的图片集合                for image in images:  # 挨个打开,图片大图(会在新的标签页打开大图)                    image.click()                curhandle = self.driver.current_window_handle  # 获取当前网页的把柄handle(网页)                print('main handle:', curhandle)                for handle in self.driver.window_handles:  # 遍历当前浏览器打开的所有handle(网页)                    print('handle:', handle)                    if not handle == curhandle:  # 遍历的handle(网页)与相册的网页handle作比较                        self.driver.switch_to.window(handle)  # 将driver的焦点转移到该大图网页                        image = self.driver.find_element_by_class_name('copyright-contextmenu')  # 找到图片所在的节点                        src = image.get_attribute('src')  # 从该节点里面取出图片的原地址链接                        downloadImageFile(src)  # 下载该图片                        self.driver.close()  # 关闭该网页,                        print(src)            except:                traceback.print_exc()                self.driver.back()                self.driver.refresh()        self.driver.quit()  # 所有的代码执行完,就退出这次程序if __name__ == '__main__':    spider = Spider()    spider.execute()

然后执行就行了。

原创粉丝点击