python 爬虫 (3)selenium

使用selenium前需要浏览器,这里用的phantomjs,是个无头浏览器,就是只加载到内存你看不到图形界面,当然其它浏览器opera,chrome,edge,ie,firefox都行。需要要

http://pythonscraping.com/pages/javascript/ajaxDemo.html就使用了ajax技术,在打开2秒后网页的内容会改变。

打开后停3秒

from selenium import webdriver
import time
driver= webdriver.PhantomJS(executable_path=r"C:\phantomjs-2.1.1-windows\bin\phantomjs.exe")#浏览器的安装路径前面要加个r,表示不进行转义,相当于c#的@
driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html")
time.sleep(3)
print(driver.find_element_by_id("content").text)#获取id content里的所有文本
driver.close()

打开后停1秒

from selenium import webdriver
import time
driver= webdriver.PhantomJS(executable_path=r"C:\phantomjs-2.1.1-windows\bin\phantomjs.exe")#路径前面要加个r,表示不进行转义,相当于c#的@
driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html")
time.sleep(1)
print(driver.find_element_by_id("content").text)#获取id content里的所有文本
driver.close()

使用beautifulsoup来解析selenium返回的网页内容

from selenium import webdriver
import time
from bs4  import *
driver= webdriver.PhantomJS(executable_path=r"C:\phantomjs-2.1.1-windows\bin\phantomjs.exe")#路径前面要加个r,表示不进行转义,相当于c#的@
driver.get("http://top.baidu.com/buzz?b=1&fr=tph_right")
time.sleep(5)
furl_bs=BeautifulSoup(driver.page_source)
furl=furl_bs.find_all("a",{"class":"list-title"})
print(len(furl))
for x in furl:
    print(x.get_text())
driver.close()

可以看到有50条标题,如果是用request是没有这么多的。

用xpath获取元素并写入到mysql里

from selenium import webdriver
import time
import pymysql
driver= webdriver.PhantomJS(executable_path=r"C:\phantomjs-2.1.1-windows\bin\phantomjs.exe")#路径前面要加个r,表示不进行转义,相当于c#的@
driver.get("http://top.baidu.com/buzz?b=1&fr=tph_right")
time.sleep(1)
title=driver.find_elements_by_xpath('//a[@class="list-title"]')#所有class属性是list——titleda标签
print(len(title))#'//tr[@class="hideline"]/td'所有在class元素的属性为hidelinetr标签后的td标签

con0=pymysql.connect(host='127.0.0.1',user='zanllp',password='*****',charset='utf8')
cur0=con0.cursor()
cur0.execute("USE scraping")

for x in range(0,len(title)):
    sql='INSERT INTO pages (title,url) VALUES("%s","%s")'%(title[x].text,title[x].get_attribute("href"))#获取文本,获取href元素
    cur0.execute(sql)
    con0.commit()
cur0.close()
con0.close()
driver.close()

selenium定时停止加载

selenium默认是加载完网页才进行下一步的,有的网页要几十秒甚至分钟才加载完,但我们需要的信息基本上只要几秒就已经加载完了,使用定时停止加载可以节省大量的时间。

    driver_0= webdriver.Chrome(executable_path=r"C:\chromedriver.exe",chrome_options=chrome_options)#路径前面要加个r,表示不进行转义,相当于c#的@
    driver_0.set_page_load_timeout(10)#设置页面最长加载时间,超过会抛出异常

    try:#超时后会停止加载,不需要其它的。接住异常就行
        driver_0.get(furl)
    except Exception as e:
        print(e)

页面卡死的处理方式

这里用的是chrome浏览器,在进行频繁的操作有时会出现页面卡死,不动的情况,不知道是哪里出现了问题,不过重启浏览器可以很好的解决这个问题

  
          def OpenBrower(a=2):
                global driver_0
                global driver_1
                chrome_options = webdriver.ChromeOptions()#不加载图片
                prefs = {"profile.managed_default_content_settings.images":2}
                chrome_options.add_experimental_option("prefs",prefs)
                if a==0 or a==2 :#a==2的话浏览器01都打开,a==1只打开浏览器1
                    driver_0= webdriver.Chrome(executable_path=r"C:\chromedriver.exe",chrome_options=chrome_options)#路径前面要加个r,表示不进行转义,相当于c#的@
                    driver_0.set_page_load_timeout(10)#页面最长加载时间,超过会抛出异常
                if a==1 or a==2 :
                    driver_1= webdriver.Chrome(executable_path=r"C:\chromedriver.exe",chrome_options=chrome_options)
                    driver_1.set_page_load_timeout(3) 


            try:
                GetContent()#获取第一个链接的内容,并写入数据库
                val_hot_now+=1
            except Exception as e:
                print("出了点小问题,重启下浏览器",e)
                driver_1.quit()#虽然找不到是什么原因,不过重启浏览器还挺有效,就是耗时间
                OpenBrower(1)#只打开第1个浏览器   

展开阅读全文

没有更多推荐了,返回首页