欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用selenium和pyquery爬取京東商品列表過(guò)程解析

 更新時(shí)間:2019年08月15日 10:10:04   作者:alunbar  
這篇文章主要介紹了使用selenium和pyquery爬取京東商品列表過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

今天一起學(xué)起使用selenium和pyquery爬取京東的商品列表。本文的所有代碼是在pycharm IDE中完成的,操作系統(tǒng)window 10。

1、準(zhǔn)備工作

安裝pyquery和selenium類庫(kù)。依次點(diǎn)擊file->settings,會(huì)彈出如下的界面:


然后依次點(diǎn)擊:project->project Interpreter->"+",,如上圖的紅色框所示。然后會(huì)彈出下面的界面:

輸入selenium,在結(jié)果列表中選中“selenium”,點(diǎn)擊“install package”按鈕安裝selenium類庫(kù)。pyquery也是一樣的安裝方法。

安裝chrome和chrome driver插件。chrome dirver插件下載地址:http://npm.taobao.org/mirrors/chromedriver/。 切記chrome和chrome dirver的版本要一致。我的chrome版本是70,對(duì)應(yīng)chrome driver是2.44,2.43,2.42。

下載chrome driver解壓后,將exe文件拷貝到pycharm開(kāi)發(fā)空間的Scripts文件夾中:

2、分析要爬取的頁(yè)面

這次是爬取京東圖書(shū)中計(jì)算機(jī)書(shū)籍類書(shū)籍的信息。

打開(kāi)chrome,打開(kāi)開(kāi)發(fā)者工具,輸入www.jd.com,分析查詢輸入框和查詢按鈕的css代碼:


通過(guò)分析發(fā)現(xiàn),搜索框的css代碼是id=“key”,查詢按鈕的css代碼是class=“button”。下面是使用selenium調(diào)用chrome瀏覽器在搜索框輸入關(guān)鍵詞“計(jì)算機(jī)書(shū)籍”并點(diǎn)擊查詢按鈕出發(fā)查詢請(qǐng)求的代碼:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from pyquery import PyQuery as pq

#通過(guò)Chrome()方法打開(kāi)chrome瀏覽器
browser = webdriver.Chrome()
#訪問(wèn)京東網(wǎng)站
browser.get("https://www.jd.com")
#等待50秒
wait = WebDriverWait(browser, 50)
#通過(guò)css選擇器的id屬性獲得輸入框
input = browser.find_element_by_id('key')
#在輸入框中寫(xiě)入要查詢的信息
input.send_keys('計(jì)算機(jī)書(shū)籍')
#獲取查詢按鈕
submit_button = browser.find_element_by_class_name('button')
#點(diǎn)擊查詢按鈕
submit_button.click()

上面代碼成功啟動(dòng)chrome瀏覽器,自動(dòng)完成在搜索框中輸入關(guān)鍵詞并點(diǎn)擊查詢按鈕的操作。

點(diǎn)擊完查詢按鈕之后,會(huì)加載出符合條件的書(shū)籍,如下圖所示:

鼠標(biāo)往下滾動(dòng)到達(dá)網(wǎng)頁(yè)底部時(shí),會(huì)看到分頁(yè)的界面:

下一步要做的工作就是分析商品列表頁(yè)和分頁(yè)的css代碼。

我們要爬去圖書(shū)的書(shū)名、圖片、價(jià)格、出版社、評(píng)價(jià)數(shù)量信息。下圖是商品列表也的界面,

通過(guò)開(kāi)發(fā)者工具可知class="gl-item"的li節(jié)點(diǎn)是一條商品的信息,上圖這個(gè)的紅色框。

  • 綠色框是商品的圖片信息。對(duì)應(yīng)的是class=“p-img”的div節(jié)點(diǎn)。
  • 藍(lán)色框是商品的價(jià)格信息,對(duì)應(yīng)的是class="p-price"的div節(jié)點(diǎn)。
  • 黑色框是商品的名稱信息,對(duì)應(yīng)的是class="p-name"的div節(jié)點(diǎn)。
  • 紫色狂是商品的評(píng)價(jià)信息,對(duì)應(yīng)的是class="p-commit"的div節(jié)點(diǎn)。
  • 褐色框是商品的出版社信息,對(duì)應(yīng)的是class=“p-shopnum”的div節(jié)點(diǎn)。

我們使用pyquery解析商品的信息,使用selenium打開(kāi)一個(gè)頁(yè)面時(shí),通過(guò)page_source屬性就可以得到頁(yè)面的源碼。

這里有個(gè)坑需要注意:京東的商品列表頁(yè)是顯示固定數(shù)量的商品,當(dāng)加載新的商品頁(yè)的時(shí)候,并不是一下子把該頁(yè)的商品都加載出來(lái),而是鼠標(biāo)向下滾動(dòng)時(shí)才會(huì)動(dòng)態(tài)加載新的商品。因此我們?cè)谑褂胹elenium時(shí),要將鼠標(biāo)設(shè)置自動(dòng)滾動(dòng)到商品列表頁(yè)的底部,這樣就會(huì)把該頁(yè)的所有商品都顯示出現(xiàn),爬取的數(shù)據(jù)才能完整,否則會(huì)出現(xiàn)丟失。

下面給出解析一個(gè)商品的代碼:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from pyquery import PyQuery as pq
import time
#通過(guò)Chrome()方法打開(kāi)chrome瀏覽器
browser = webdriver.Chrome()
#訪問(wèn)京東網(wǎng)站
browser.get("https://www.jd.com")
#等待50秒
wait = WebDriverWait(browser, 50)
#通過(guò)css選擇器的id屬性獲得輸入框
input = browser.find_element_by_id('key')
#在輸入框中寫(xiě)入要查詢的信息
input.send_keys('計(jì)算機(jī)書(shū)籍')
#獲取查詢按鈕
submit_button = browser.find_element_by_class_name('button')
#點(diǎn)擊查詢按鈕
submit_button.click()

# 模擬下滑到底部操作
for i in range(1, 5):
  browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  time.sleep(1)

#商品列表的總頁(yè)數(shù)
total = wait.until(
  EC.presence_of_all_elements_located(
    (By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b')
  )
)

html = browser.page_source.replace('xmlns', 'another_attr')

doc = pq(html)
#一個(gè)商品信息是存放在class=“gl-item”的li節(jié)點(diǎn)內(nèi),items()方法是獲取所有的商品列表。
li_list = doc('.gl-item').items()
#循環(huán)解析每個(gè)商品的信息
for item in li_list:
  image_html = item('.gl-i-wrap .p-img')
  book_img_url = item.find('img').attr('data-lazy-img')
  if book_img_url == "done":
    book_img_url = item.find('img').attr('src')
  print('圖片地址:' + book_img_url)
  item('.p-name').find('font').remove()
  book_name = item('.p-name').find('em').text()
  print('書(shū)名:' + book_name)
  price = item('.p-price').find('em').text() + str(item('.p-price').find('i').text())
  print('價(jià)格:' + price)
  commit = item('.p-commit').find('strong').text()
  print('評(píng)價(jià)數(shù)量:' + commit)
  shopnum = item('.p-shopnum').find('a').text()
  print('出版社:' + shopnum)
  print('++++++++++++++++++++++++++++++++++++++++++++')

對(duì)于有分頁(yè)的情況,需要一頁(yè)一頁(yè)的解析商品,我們可以通過(guò)selenium調(diào)用“下一頁(yè)”按鈕來(lái)獲取下一頁(yè)的源代碼。我們來(lái)分析下一頁(yè)的css代碼,滾動(dòng)鼠標(biāo)到網(wǎng)頁(yè)的底部,會(huì)看到分頁(yè)的情況:

通過(guò)上圖可知,需要獲取到“下一頁(yè)”按鈕,然后調(diào)用click方法。相應(yīng)的代碼為:

  next_page_button = wait.until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
  )
  next_page_button.click()

  #滑動(dòng)到頁(yè)面底部,用于加載數(shù)據(jù)
  for i in range(0,3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(10)

  #一頁(yè)顯示60個(gè)商品,"#J_goodsList > ul > li:nth-child(60)確保60個(gè)商品都正常加載出來(lái)。
  wait.until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
  )
  # 判斷翻頁(yè)成功,當(dāng)?shù)撞康姆猪?yè)界面上顯示第幾頁(yè)時(shí),就顯示翻頁(yè)成功。
  wait.until(
    EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_num))
  )

下面給出完整代碼:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from pyquery import PyQuery as pq
import time
#打開(kāi)不同的瀏覽器實(shí)例
def openBrower(brower_type):
  if brower_type == 'chrome':
    return webdriver.Chrome()
  elif brower_type == 'firefox':
    return webdriver.Firefox()
  elif brower_type == 'safari':
    return webdriver.Safari()
  elif brower_type == 'PhantomJS':
    return webdriver.PhantomJS()
  else :
    return webdriver.Ie()
def parse_website():
  # 通過(guò)Chrome()方法打開(kāi)chrome瀏覽器
  browser = openBrower('chrome')
  # 訪問(wèn)京東網(wǎng)站
  browser.get("https://www.jd.com")
  # 等待50秒
  wait = WebDriverWait(browser, 50)
  # 通過(guò)css選擇器的id屬性獲得輸入框。until方法表示瀏覽器完全加載到對(duì)應(yīng)的節(jié)點(diǎn),才返回相應(yīng)的對(duì)象。presence_of_all_elements_located是通過(guò)css選擇器加載節(jié)點(diǎn)
  input = wait.until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#key'))
  )

  # input = browser.find_element_by_id('key')
  # 在輸入框中寫(xiě)入要查詢的信息
  input[0].send_keys('計(jì)算機(jī)書(shū)籍')
  # 查詢按鈕完全加載完畢,返回查詢按鈕對(duì)象
  submit_button = wait.until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, '.button'))
  )
  # 點(diǎn)擊查詢按鈕
  submit_button.click()

  # 模擬下滑到底部操作
  for i in range(0,3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)

  # 商品列表的總頁(yè)數(shù)
  total = wait.until(
    EC.presence_of_all_elements_located(
      (By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b')
    )
  )
  html = browser.page_source.replace('xmlns', 'another_attr')
  parse_book(1,html)

  for page_num in range(2,int(total[0].text) + 1):
    parse_next_page(page_num,browser,wait)

##解析下一頁(yè)
def parse_next_page(page_num,browser,wait):

  next_page_button = wait.until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
  )
  next_page_button.click()

  #滑動(dòng)到頁(yè)面底部,用于加載數(shù)據(jù)
  for i in range(0,3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(10)

  #一頁(yè)顯示60個(gè)商品,"#J_goodsList > ul > li:nth-child(60)確保60個(gè)商品都正常加載出來(lái)。
  wait.until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
  )
  # 判斷翻頁(yè)成功,當(dāng)?shù)撞康姆猪?yè)界面上顯示第幾頁(yè)時(shí),就顯示翻頁(yè)成功。
  wait.until(
    EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_num))
  )

  html = browser.page_source.replace('xmlns', 'another_attr')
  parse_book(page_num, html)

def parse_book(page,html):
  doc = pq(html)
  li_list = doc('.gl-item').items()
  print('-------------------第' + str(page) + '頁(yè)的圖書(shū)信息---------------------')
  for item in li_list:
    image_html = item('.gl-i-wrap .p-img')
    book_img_url = item.find('img').attr('data-lazy-img')
    if book_img_url == "done":
      book_img_url = item.find('img').attr('src')
    print('圖片地址:' + book_img_url)
    item('.p-name').find('font').remove()
    book_name = item('.p-name').find('em').text()
    print('書(shū)名:' + book_name)
    price = item('.p-price').find('em').text() + str(item('.p-price').find('i').text())
    print('價(jià)格:' + price)
    commit = item('.p-commit').find('strong').text()
    print('評(píng)價(jià)數(shù)量:' + commit)
    shopnum = item('.p-shopnum').find('a').text()
    print('出版社:' + shopnum)
    print('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')

def main():
  parse_website()
if __name__ == "__main__":
  main()

3、總結(jié)

(1)要記得調(diào)用 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")方法模擬鼠標(biāo)向下滾動(dòng)的操作加載數(shù)據(jù),否則數(shù)據(jù)會(huì)不完整。

(2)在通過(guò)page_source獲取網(wǎng)頁(yè)源碼時(shí),如果有xmlns命名空間,則要將該命名空間空其他的字段代替,否則使用pyquery解析網(wǎng)頁(yè)時(shí),會(huì)解析不出數(shù)據(jù)。pyquery解析xmlns命名空間時(shí),會(huì)自動(dòng)隱藏掉某些屬性。導(dǎo)致無(wú)法征程解析網(wǎng)頁(yè),原因不詳,如果有人知道原因請(qǐng)告知。

(3)盡量用wait.until(EC.presence_of_all_elements_located())方法,這樣可以避免網(wǎng)頁(yè)無(wú)法正常加載而提前返回網(wǎng)頁(yè)信息的情況。保證數(shù)據(jù)的準(zhǔn)確。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Django驗(yàn)證碼的生成與使用示例

    Django驗(yàn)證碼的生成與使用示例

    關(guān)于django的驗(yàn)證碼的使用,在網(wǎng)上找到了相關(guān)的資料,現(xiàn)在整理一下分享給大家,下面這篇文章主要給大家介紹了關(guān)于Django驗(yàn)證碼的生成與使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-05-05
  • Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器

    Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python根據(jù)成績(jī)分析系統(tǒng)淺析

    Python根據(jù)成績(jī)分析系統(tǒng)淺析

    在本篇文章里小編給大家分享了關(guān)于Python根據(jù)成績(jī)分析是否繼續(xù)深造一個(gè)系統(tǒng)的相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • Python著名游戲?qū)崙?zhàn)之方塊連接 我的世界

    Python著名游戲?qū)崙?zhàn)之方塊連接 我的世界

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你模仿著名游戲——我的世界,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣
    2021-10-10
  • python re模塊匹配貪婪和非貪婪模式詳解

    python re模塊匹配貪婪和非貪婪模式詳解

    這篇文章主要介紹了python re模塊匹配貪婪和非貪婪模式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 六個(gè)Python編程最受用的內(nèi)置函數(shù)使用詳解

    六個(gè)Python編程最受用的內(nèi)置函數(shù)使用詳解

    在日常的python編程中使用這幾個(gè)函數(shù)來(lái)簡(jiǎn)化我們的編程工作,經(jīng)常使用能使編程效率大大地提高。本文為大家總結(jié)了六個(gè)Python編程最受用的內(nèi)置函數(shù),感興趣的可以了解一下
    2022-07-07
  • Python全棧之遞歸函數(shù)

    Python全棧之遞歸函數(shù)

    這篇文章主要為大家介紹了Python遞歸函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Pytorch搭建SRGAN平臺(tái)提升圖片超分辨率

    Pytorch搭建SRGAN平臺(tái)提升圖片超分辨率

    這篇文章主要為大家介紹了Pytorch搭建SRGAN平臺(tái)提升圖片超分辨率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Python利用itchat對(duì)微信中好友數(shù)據(jù)實(shí)現(xiàn)簡(jiǎn)單分析的方法

    Python利用itchat對(duì)微信中好友數(shù)據(jù)實(shí)現(xiàn)簡(jiǎn)單分析的方法

    Python 熱度一直很高,我感覺(jué)這就是得益于擁有大量的包資源,極大的方便了開(kāi)發(fā)人員的需求。下面這篇文章主要給大家介紹了關(guān)于Python利用itchat實(shí)現(xiàn)對(duì)微信中好友數(shù)據(jù)進(jìn)行簡(jiǎn)單分析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-11-11
  • Python如何避免文件同名產(chǎn)生覆蓋

    Python如何避免文件同名產(chǎn)生覆蓋

    這篇文章主要介紹了Python如何避免文件同名產(chǎn)生覆蓋,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論