爬虫類学習08.PythonのWebクローラーの画像遅延ロード法、セレン及びPhantomJS
導入
今日概要
- 写真遅延ロード
- セレン
- phantomJs
- Googleのヘッドレスブラウザ
知識のレビュー
- PIN処理の流れ
詳細は本日
動的なデータのロード処理
A.イメージ遅延ロード
画像遅延ロードとは何ですか?
ケーススタディ:ウェブマスター材料内のクロールされた画像データhttp://sc.chinaz.com/
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #获取页面文本数据 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析页面数据(获取页面中的图片链接) #创建etree对象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') #解析获取图片地址和图片的名称 for div in div_list: image_url = div.xpath('.//img/@src') image_name = div.xpath('.//img/@alt') print(image_url) #打印图片链接 print(image_name)#打印图片名称
- 業績は、私たちが絵の名前を取得することができ、観察されたが、空の検査のためのリンクは、それがどこにあるのでは、XPathの式は問題ではありません理由の嘘を発見しましたか?
写真遅延ロードのコンセプト:
- 写真遅延ロードウェブページの最適化技術。一度にネットワークリソースとしてではなく、通常の静的なリソースとしての写真、要求、ネットワークリソースが、すべての写真をページ全体が完成読み込みで、最初の画面が大幅にページのロード時間が増加します。絵は技術的な絵最初の画面のための要求の数を減らすために、唯一の現在のブラウザウィンドウに表示されたときに画像をロードするために彼らとフロントとリアの最後まで、この問題を解決するには、「映像遅延ロード」と呼ばれています。
ウェブサイトの一般的な絵どのように遅延ロードテクノロジー?
- ページのソースコードは、最初のストアリンクではなく、実際の画像に(...通常SRC2、元)imgタグで「擬似属性を」使用するsrc属性に直接格納されています。画像がページの視覚的な領域に表示されたら、擬似動的プロパティは、src属性を交換し、画像をダウンロードします。
マスターケース素材その後の分析:リンクを見つけることによって、ページの構造の注意深い観察は、Webページの画像は、この擬似SRC2にプロパティに格納された後、
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #获取页面文本数据 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析页面数据(获取页面中的图片链接) #创建etree对象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') #解析获取图片地址和图片的名称 for div in div_list: image_url = div.xpath('.//img/@src2') #src2伪属性 image_name = div.xpath('.//img/@alt') print(image_url) #打印图片链接 print(image_name)#打印图片名称
簡単な紹介
このような入力、ドロップダウンをクリックして、などジャンプ、など、完全にブラウザの動作をシミュレート、当初セレンは、自動テストツールであり、爬虫類はセレン要求の性質の問題は、JavaScriptコードを実行することはできません解決するために、主にそれを使用する直接ブラウザによって駆動され、結果の後に複数のブラウザをサポートするために、ページのレンダリングを取得します
環境インストール
- セレンをダウンロードしてインストール:ピップは、セレンをインストール
- ブラウザのドライバをダウンロードします。
- http://chromedriver.storage.googleapis.com/index.html
- ドライブとブラウザのバージョンとの間のマッピングを確認します。
- http://blog.csdn.net/huilan_same/article/details/51896672
使用/表示効果にシンプル
from selenium import webdriver
from time import sleep
# 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
driver = webdriver.Chrome(r'驱动程序路径')
# 用get打开百度页面
driver.get("http://www.baidu.com")
# 查找页面的“设置”选项,并进行点击
driver.find_elements_by_link_text('设置')[0].click()
sleep(2)
# # 打开设置后找到“搜索设置”选项,设置为每页显示50条
driver.find_elements_by_link_text('搜索设置')[0].click()
sleep(2)
# 选中每页显示50条
m = driver.find_element_by_id('nr')
sleep(2)
m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
m.find_element_by_xpath('.//option[3]').click()
sleep(2)
# 点击保存设置
driver.find_elements_by_class_name("prefpanelgo")[0].click()
sleep(2)
# 处理弹出的警告页面 确定accept() 和 取消dismiss()
driver.switch_to_alert().accept()
sleep(2)
# 找到百度的输入框,并输入 美女
driver.find_element_by_id('kw').send_keys('美女')
sleep(2)
# 点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)
# 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面
driver.find_elements_by_link_text('美女_百度图片')[0].click()
sleep(3)
# 关闭浏览器
driver.quit()
作成するには、ブラウザ
セレンは、などのクロム、Firefoxの、エッジ、などのブラウザ、だけでなく、アンドロイド、ブラックベリーやその他の携帯端末のブラウザの多くをサポートしています。また、インターフェースはまた、ブラウザ以外のPhantomJSをサポートしています。
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
位置決め要素
webdriverをは以下の通りである一般的に使用される、要素の位置決め方法の範囲を提供します。
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
ご注意ください
1、find_element_by_xxx find_elements_by_xxxすべての適格なラベルを探し、資格の最初のラベルを探しています。
2は、ID、CSSセレクタとXPathによると、彼らは正確に結果を返す、取得しました。
セレンはまた、一般的な方法を提供し、また3は、find_element()
それは2つの引数を取ります。方法検索By
して値を。実際に、それはfind_element_by_id()
、この方法の機能のジェネリックバージョン、例えば、find_element_by_id(id)
に相当するfind_element(By.ID, id)
結果の両方が同じ得ます。
ノード間相互作用
セレンは、ブラウザが何らかのアクションを実行シミュレートすることを可能にすること、いくつかの操作を実行するためにブラウザを駆動することができます。より一般的な用途は以下のとおりです。使用してテキストを入力する際にsend_keys()
空の単語の使用している場合、この方法をclear()
使用すると、ボタンをクリックしたときに使用される方法click()
のアプローチを。例としては、次のとおりです:
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('MAC')
time.sleep(1)
input.clear()
input.send_keys('IPhone')
button = browser.find_element_by_class_name('btn-search')
button.click()
browser.quit()
アクションチェーン
上記の例では、対話型アクションの数は、ノードのために実行されます。例えば、入力ボックスのために、私たちは、空のテキストおよびテキスト入力メソッドを呼び出し、ボタンのために、あなたはそのクリックのメソッドを呼び出します。実際には、これらの動作を別の方法を実行する、など、キーボードのキー、マウスをドラッグするなどの特定のオブジェクトを、実行しないいくつかの他の操作があるチェーンの動作こと。
例えば、ノードは、現在のドラッグ操作が達成される、もう一つの特定のノードからドラッグは、達成することができます。
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
# actions.drag_and_drop(source, target)
# actions.perform() #执行动作链
actions.click_and_hold(source)
time.sleep(3)
for i in range(5):
actions.move_by_offset(xoffset=17,yoffset=0).perform()
time.sleep(0.5)
actions.release()
JavaScriptの実行
いくつかの操作については、SeleniumのAPIが用意されていません。例えば、プログレスバープルダウンは、それが直接のJavaScriptを実行しているシミュレートすることができ、使用して、この時間execute_script()
は次のような方法は、実施することができます。
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.jd.com/')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("123")')
ページのソースデータを取得します
page_source
ウェブページ属性のソースコードを取得してもよいし、解析ライブラリは、情報を抽出する(例えば、正規表現、美しいスープ、pyquery等)を用いることができます。
前方と後方
#模拟浏览器的前进后退
import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('http://www.sina.com.cn/')
browser.back()
time.sleep(10)
browser.forward()
browser.close()
Cookie処理
使用セレンは、クッキーのためにも、容易な取得、追加、削除クッキーなどなどの操作を行うことができます。例としては、次のとおりです:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
例外処理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
try:
browser=webdriver.Chrome()
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframssseResult')
except TimeoutException as e:
print(e)
except NoSuchFrameException as e:
print(e)
finally:
browser.close()
phantomJS
PhantomJSは、ブラウザ以外のインターフェース、自動化業務プロセスや操作、Googleのブラウザが同じです。それはインターフェイスではありませんので、自動化業務プロセスを表示することができるようにするために、PhantomJSは、スクリーンショット機能をsave_screenshot関数の実装の使用をユーザーに提供します。
from selenium import webdriver
import time
# phantomjs路径
path = r'PhantomJS驱动路径'
browser = webdriver.PhantomJS(path)
# 打开百度
url = 'http://www.baidu.com/'
browser.get(url)
time.sleep(3)
browser.save_screenshot(r'phantomjs\baidu.png')
# 查找input输入框
my_input = browser.find_element_by_id('kw')
# 往框里面写文字
my_input.send_keys('美女')
time.sleep(3)
#截屏
browser.save_screenshot(r'phantomjs\meinv.png')
# 查找搜索按钮
button = browser.find_elements_by_class_name('s_btn')[0]
button.click()
time.sleep(3)
browser.save_screenshot(r'phantomjs\show.png')
time.sleep(3)
browser.quit()
Googleのヘッドレスブラウザ
我々は、Googleのヘッドレスブラウザを使用することをお勧めしますので、最近、更新やメンテナンスを停止しPhantomJsので、それはグーグルのブラウザ以外のインタフェースです。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 驱动路径
path = r'C:\Users\ZBLi\Desktop\1801\day05\ziliao\chromedriver.exe'
# 创建浏览器对象
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
# 上网
url = 'http://www.baidu.com/'
browser.get(url)
time.sleep(3)
browser.save_screenshot('baidu.png')
browser.quit()
データをクロールログインQQスペース、
import requests
from selenium import webdriver
from lxml import etree
import time
driver = webdriver.Chrome(executable_path='/Users/bobo/Desktop/chromedriver')
driver.get('https://qzone.qq.com/')
#在web 应用中经常会遇到frame 嵌套页面的应用,使用WebDriver 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过switch_to_frame()方法将当前定位的主体切换了frame 里。
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
#driver.find_element_by_id('u').clear()
driver.find_element_by_id('u').send_keys('328410948') #这里填写你的QQ号
#driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys('xxxxxx') #这里填写你的QQ密码
driver.find_element_by_id('login_button').click()
time.sleep(2)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
page_text = driver.page_source
tree = etree.HTML(page_text)
#执行解析操作
li_list = tree.xpath('//ul[@id="feed_friend_list"]/li')
for li in li_list:
text_list = li.xpath('.//div[@class="f-info"]//text()|.//div[@class="f-info qz_info_cut"]//text()')
text = ''.join(text_list)
print(text+'\n\n\n')
driver.close()
多くのクロール映画情報クレソンネットワークとして
from selenium import webdriver
from time import sleep
import time
if __name__ == '__main__':
url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action='
# 发起请求前,可以让url表示的页面动态加载出更多的数据
path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe'
# 创建无界面的浏览器对象
bro = webdriver.PhantomJS(path)
# 发起url请求
bro.get(url)
time.sleep(3)
# 截图
bro.save_screenshot('1.png')
# 执行js代码(让滚动条向下偏移n个像素(作用:动态加载了更多的电影信息))
js = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(js) # 该函数可以执行一组字符串形式的js代码
time.sleep(2)
bro.execute_script(js) # 该函数可以执行一组字符串形式的js代码
time.sleep(2)
bro.save_screenshot('2.png')
time.sleep(2)
# 使用爬虫程序爬去当前url中的内容
html_source = bro.page_source # 该属性可以获取当前浏览器的当前页的源码(html)
with open('./source.html', 'w', encoding='utf-8') as fp:
fp.write(html_source)
bro.quit()
セレンEVADE検出および同定であります
多くの大規模なサイトは現在、セレンの監視機構を採用しています。例えば、通常の状況下では、我々は、淘宝網などのサイトを訪問window.navigator.webdriverブラウザで
未定義。セレンは、値がtrueにアクセスするために使用されます。それでは、どのようにこの問題を解決するには?
唯一の問題を解決するためにChromedriver起動パラメータを設定する必要があります。Chromedriverを開始する前に、クローム実験的な機能パラメータをオンにしexcludeSwitches
、それは['enable-automation']
、完全なコードは次のとおりです。
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
仕事
- 国内部門網易ニュースにニュースの見出しやニュースコンテンツをクロール