PythonのクローラベースⅢ - セレン、データストレージ



爬虫類基部Ⅲ

分析の部分とAjaxの理解のフェッチが、そのようなAjaxのインターフェース暗号化パラメータの多くが含まれている淘宝網、などいくつかのページには、我々はそれが難しい法律を指示するために見つけ、直接グラブにアヤックスを解析することは困難です。
これらの問題を解決するために、私たちが直接使用することができ、シミュレーションブラウザで実行達成するためのモードをので、あなたが何であるかを確認するために、ブラウザで行うことができ、登山に見られているソースクロールは、何です。JSはそう、彼らはどのようなパラメータを最終的にWebページの背景のAjaxインターフェースを制御しない、ページがロードされているレンダリングするためのアルゴリズム何と内部のページを制御しません。

セレン

あまりにも怠惰なスクリーンショット(スクリーンショットは、各修正TATです)

(1)セレンは何ですか

それはあなたが最初にそれをインストールする必要があり、強力なデータベースですpip install seleniumこれは、ために数行のコードを使用することができ、ブラウザを制御する、などだけで同じ操作で実際のユーザーのように、クリックなどの操作を、自動的にオープンにするために、入力。

複雑な、洗練された暗号化のウェブサイトのそれらの相互作用のために、selenium問題を単純化し、登るやすいように静的なページとしてクロール動的なページ。

動的および静的なWebページに関しては、実際にあなたが前に接触していました。

前部Ⅰとhtml書かれたページ、ページが静的です。私たちは使用BeautifulSoup(中、0番目の要求ページのソースコードは、Webページ上のすべての情報が含まれているため、このタイプのクロールされたページをpreviewすべての情報が存在を確認することができるようになります)、そのためのウェブアドレスバーURLそのページのソースコードURL

後半パートⅡで、データは、HTMLソースコードをクロールするようにされていない、そのようなQQの音楽など、より複雑なページ、との接触に入って来た、しかし、jsonあなたが直接URLバーを使用することはできません、URL必要が見つけることながら、json実際のデータをURLこれは、動的なWebページです。

データが存在する場合はいつでもリクエストが完了すると、ブラウザは常にサーバへの要求の多様によって開始され、彼らは一緒に開発ツールを形成するElements、完成したページのソースコードをレンダリング、ショーで。


(2)のメリットとデメリット

複雑なインタラクティブページまたはの顔にはURL、状況の暗号化ロジックの複雑さ、selenium便利に来て、それは本当にすべてのデータがロードされるのを待ち、ブラウザを開くことができますElementsクロールのような静的なページと、このページの後A。

使用の利点と言ったselenium時には、当然のことながら、軟膏で飛びます。

本当に、地元のブラウザを実行し、ブラウザを開いて、ネットワークレンダリングを待って、完全にいくつかの時間を取ることによりselenium、少なくともではない遅く人々よりも、スピードとより多くのリソースを犠牲にして必然的に仕事を、しかし。


それを使用する方法(3)

ブラウザのドライバをダウンロードしてください1.

まず、あなたはそれに良いをダウンロードする必要がChrome浏览器行く、その後、http://npm.taobao.org/mirrors/chromedriver/2.44/を、その後のpythonのインストールディレクトリを入れ、ブラウザの良いドライブをダウンロードするためにここに。そして、Baiduのホーム・ページがあるポップアップブラウザを開くことがありますが、以下のローカルコードを実行し、「パイソン」を検索し、ダウン一番下に、そして最終的にプロンプトをポップアップ表示し、インストールが(/≧▽≦)成功しました/

# -*- coding:utf-8 -*-
from selenium import  webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
Search = driver.find_element_by_id('kw')
Search.send_keys('Python')
time.sleep(1)
Search.send_keys(Keys.ENTER)
time.sleep(2)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(2)
driver.execute_script('alert("To Bottom")')
time.sleep(2)
driver.close()

2.ブラウザエンジン

# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块

driver = webdriver.Chrome() 
# 设置引擎为Chrome,真实地打开一个Chrome浏览器(然后赋值给变量driver,它就是一个实例化的浏览器)

データを取得する3

私たちは、以前に使用しBeautifulSoupたページのソースを解析し、その中のデータを抽出します。seleniumライブラリは、データを解析する機能、抽出データへの能力を持っています。そして、それはあるBeautifulSoup基本原則と矛盾が、詳細と構文の一部で不一致があります。selenium直接抽出されるElementsすべてのデータ、およびBeautifulSoupのみ解析されたNetwork要求0の応答。そして、とseleniumあなたはすべての情報がにロードされているWebページのオープン、Elementsそこに、そして、あなたは動的なページを置くことができ、静的なページの方法でクロール(私はリピーターではないよ)かかりました。

レッツ・利用のQQの音楽https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0%E4%BC %A6ノートを参照して、例の操作を行います。

from selenium import  webdriver
import time

driver = webdriver.Chrome() #设置浏览器
url = 'https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0%E4%BC%A6'
driver.get(url)#get(URL)是webdriver的一个方法,它的使命是为你打开指定URL的网页。
time.sleep(2)#由于浏览器缓冲加载网页需要耗费一些时间,等待1-2秒再去解析和提取比较稳妥。


driver.close()

4.解析抽出データ

最初の使用に戻って考えるBeautifulSoupまず必要なの、取得されたデータからデータを抽出するときResponseに解決オブジェクトBeautifulSoupのオブジェクト、および、データを抽出します。

ではselenium、中央、取得するためのウェブページがあるdriverでは、同じ時間を取得し、解析が行われた後で、作られていますdriver。このインスタンス化されたブラウザを完了すること。そのデータが解析されるdriver(このパイプ8)、データを自動的に抽出して行われるdriver方法。

方法 効果
find_element_by_tag_name これらは、抽出方法の個々の要素であります
find_element_by_class_name 言うまでもなく、既知の名前の意味を参照してください!
find_element_by_id あなたが抽出したい複数の要素は、単に要素Jiuhaolaに要素を入れます
find_element_by_name find_element_by_class_nameない場合は、クラス名は、複雑に配置することができないことにも注意してください(「XXX XXX」)
find_element_by_link_text
find_element_by_partial_link_text

抽出された要素である<class 'selenium.webdriver.remote.webelement.WebElement'>このクラスの、それはBeautifulSoupあるTagオブジェクトに似て、だけでなく、テキストの属性と属性値を抽出し、次のオブジェクトの使用WebElementタグ比較対象を置きます:

要素 鬼ごっこ 効果
WebElement.text Tag.text テキストを抽出
WebElement.get_attribute() 鬼ごっこ[ ] 塗りつぶし属性名、プロパティ値を返します。

この例:

# 以下方法都可以从网页中提取出'你好啊!'这段文字-------------------

find_element_by_tag_name:通过元素的名称选择
# 如<h1>你好啊!</h1> 
# 可以使用find_element_by_tag_name('h1')

find_element_by_class_name:通过元素的class属性选择
# 如<h1 class="title">你好啊!</h1>
# 可以使用find_element_by_class_name('title')

find_element_by_id:通过元素的id选择
# 如<h1 id="title">你好啊!</h1> 
# 可以使用find_element_by_id('title')

find_element_by_name:通过元素的name属性选择
# 如<h1 name="hello">你好啊!</h1> 
# 可以使用find_element_by_name('hello')


#以下两个方法可以提取出超链接------------------------------------

find_element_by_link_text:通过链接文本获取超链接
# 如<a href="spidermen.html">你好啊!</a>
# 可以使用find_element_by_link_text('你好啊!')

find_element_by_partial_link_text:通过链接的部分文本获取超链接
# 如<a href="https://localprod.pandateacher.com/python-manuscript/hello-spiderman/">你好啊!</a>
# 可以使用find_element_by_partial_link_text('你好')

例5

ジェイQQの音楽や歌の名前https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0% E4%のBC%A6は、ここで最初のページのみがセレンで抽出されたが、JSON〜でそれを探すために必要はありません!

# -*- coding: utf-8 -*-
from selenium import  webdriver
import time

driver = webdriver.Chrome() #设置浏览器
url = 'https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0%E4%BC%A6'
driver.get(url)#get(URL)是webdriver的一个方法,它的使命是为你打开指定URL的网页。
time.sleep(2)#由于浏览器缓冲加载网页需要耗费一些时间,等待1-2秒再去解析和提取比较稳妥。

# 直接定位提取数据
song_ul = driver.find_element_by_class_name('songlist__list')
song_li = song_ul.find_elements_by_class_name('js_songlist__child')

for song in song_li:
    name = song.find_element_by_class_name('songlist__songname_txt')
    print(name.text.strip())

driver.close()

BSと一緒に使用6.セレン

Webページのための最初のレンダリングの完全なソースコードを取得するために、セレンを使用すると、その後、文字列 BSに戻っはパースと抽出の形をとります。(なぜ彼らが欲しいです)

どのようにそれを取得しますか?また、使用driverする方法を:page_source

HTML源代码字符串 = driver.page_source 

例:

# -*- coding: utf-8 -*-
from selenium import  webdriver
import time,bs4

driver = webdriver.Chrome() #设置浏览器
url = 'https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%91%A8%E6%9D%B0%E4%BC%A6'
driver.get(url)#get(URL)是webdriver的一个方法,它的使命是为你打开指定URL的网页。
time.sleep(2)#由于浏览器缓冲加载网页需要耗费一些时间,等待1-2秒再去解析和提取比较稳妥。

# 用BS解析网页
song = bs4.BeautifulSoup(driver.page_source,'html.parser')

# 直接定位提取数据
song_ul = song.find(class_='songlist__list')
song_li = song_ul.find_all(class_='js_songlist__child')

for song in song_li:
    name = song.find(class_='songlist__songname_txt')
    print(name.text.strip())

driver.close()

無用セレン前に、我々は唯一の曲の情報を登るされていないBSの解像度を使用し、そして今、あなたは、なぜ考えることができます


7.セレンノードとの対話方法

.send_keys('你想输入的内容') # 模拟按键输入,自动填写表单
#你只需要定位到那个输入的框框那里,再用这个方法就可以往输入框里输入

.click() # 点击元素
#定位到能点的地方,基本上都能点

.clear() # 清空元素的内容
#清空你send_keys()里边输入的

:その他の操作は、対話内容の公式ドキュメントで見つけることができるここで
、「パイソン」のためのBaiduの検索を開き、例:

# -*- coding: utf-8 -*-
from selenium import  webdriver
import time
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome() #设置浏览器
url = 'http://www.baidu.com'
driver.get(url)#get(URL)是webdriver的一个方法,它的使命是为你打开指定URL的网页。
time.sleep(2)#由于浏览器缓冲加载网页需要耗费一些时间,等待1-2秒再去解析和提取比较稳妥。

#定位<input>标签
baidu = driver.find_elements_by_tag_name('input')

#输入框是第7个
baidu[7].send_keys('Python')
time.sleep(1)

#搜索是第8个,并点击
baidu[8].click()

# 也可以用下面的按下回车事件来代替点击搜索按钮
# baidu[7].send_keys(Keys.ENTER)

time.sleep(3)
driver.close()

8.インタフェースモードがNoneに設定されています

Chromeはバージョン59以上にアップグレードする必要があります。

# 本地Chrome浏览器的静默默模式设置:
from selenium import  webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类

chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行

ブラウザがバックグラウンドで実行されますので、私たちはそれをブロックしないと思います。


データストレージ

例:v張Jiaweiはほとんど大きな記事、「タイトル」、「概要」、「リンク」、およびローカルファイルに保存されているを知っています。あなたは、関連するモジュールをインストールする必要があります。コードのコメントを参照してください。

(1)のxlsxファイルを書き込みます

import requests
import openpyxl
from bs4 import BeautifulSoup
import csv

headers = {
    'referer': 'https://www.zhihu.com/people/zhang-jia-wei/posts/posts_by_votes',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36'
}

#HTML里只放了两篇文章,然后去XHR里面找找看,有两个article的请求,在第二个找到了第一页的detail,可用json提取
#再比较各页参数,用循环写就可以获取多页的detail了
list1 = [] #用于储存detail
n = 1
for i in range(3): #这里找两页,否则会给对方服务器造成很大压力
    params = {
        'include': 'data[*].comment_count,suggest_edit,is_normal,thumbnail_extra_info,thumbnail,can_comment,comment_permission,admin_closed_comment,content,voteup_count,created,updated,upvoted_followees,voting,review_info,is_labeled,label_info;data[*].author.badge[?(type=best_answerer)].topics',
        'offset': str(i*20),
        'limit': str(20),
        'sort_by': 'voteups'
    }
    res = requests.get('https://www.zhihu.com/api/v4/members/zhang-jia-wei/articles',headers=headers,params=params)
    #print(res.status_code)
    detaillist = res.json()
    articlelist = detaillist['data']
    for article in articlelist:
        # 把title、url、excerpt写成列表,后边用append函数一行行写入Excel
        list1.append([article['title'],article['url'],article['excerpt']])

#开始储存
#创建工作薄
wb = openpyxl.Workbook()
#获取工作薄的活动表
sheet = wb.active
#工作表重命名
sheet.title = 'zjw' 
#加表头,给A1单元格B1...赋值
sheet['A1'] = '文章标题' 
sheet['B1'] = '文章链接'
sheet['C1'] = '摘要'

for i in list1:
    sheet.append(i) #每次写入一行
wb.save('zhihuspider.xlsx') #记得保存格式为xlsx

次に、ディレクトリ内のPYファイルは、zhihuspider.xlsxファイルそれがあるでしょう!


(2)書き込みcsvファイル

#或者用csv储存
csv_file = open('zhihuspider.csv','w',newline='',encoding='utf-8')
writer = csv.writer(csv_file) #用csv.writer()函数创建一个writer对象。
list2 = ['标题','链接','摘要']
#调用writer对象的writerow()方法,可以在csv文件里写入一行文字 “标题”和“链接”和"摘要"。
writer.writerow(list2)

for article in list1:
    writer.writerow(article) #每次写入一行
csv_file.close()



--------誰もが人生について不平を言っていることは容易ではありませんが、生活のために静かに難しいです--------

公開された16元の記事 ウォンの賞賛113 ビュー4892

おすすめ

転載: blog.csdn.net/qq_43280818/article/details/97045264