Selenium爬取淘寶美食前100頁

爬取淘寶美食前100頁的title,image,location等并存到mongodb上
selenium python 官網:http://selenium-python.readthedocs.io/
http://selenium-python-zh.readthedocs.io/en/latest/

1.png

程序在 windows10 下執行
首先安裝各種模塊和庫:

  1. 安裝Selenium,pip install selenium
    它是自動化測試工具。支持各種瀏覽器,包括 Chrome,Safari,Firefox 等主流界面式瀏覽器,安裝一個Seleium驅動,我安裝的是谷歌 webdriver.Chrome(),這是驅動地址:https://npm.taobao.org/mirrors/chromedriver/2.34/(國內的源)

有界面的自動化瀏覽器只適合測試,總不能爬取的時候一直開著一個瀏覽器吧,PhantomJS 是無界面的瀏覽器, 用 Google 瀏覽器測試完后就換成這個,
下載地址:http://phantomjs.org/

運行時出現 warnings.warn('Selenium support for PhantomJS has been deprecated, please us , 搜了一下是說 Selenium 以后不再支持 PhantomJS , 百度上說舊版的 PhantomJS 可以使用,試了還是不行,就直接換成了 Google 的 chromedriver.exe

  1. 下載地址是 https://npm.taobao.org/mirrors/chromedriver/
    下載后的 chromedriver.exe 文件要在程序中導入所在的路徑,見 browser

我用的 Google Chrome 是 32位的 66.0 ,下載的 chromedriver.exe 是 2.37 的,運行成功。
將下載的 chromedriver.exe 文件拖動到python安裝目錄下,使得 python 可以找得到這個文件就可以了。

  1. 安裝 Pyquery, pip install pyquery
    pyquery 類似 jquery 的用法,有許多的方法和函數,可以精確定位網頁中的元素,屬于解析 html 網頁的庫。

  2. 安裝 pymongo, pip install pymongo
    python 調用 mongodb,需要 pymongo 驅動

由于在電腦上安裝完 mongoDB 一直連接不上,總是 failed ,所幸就在虛擬機上安裝 mongoDB ,在虛擬機上又跑不動那么多程序,只能把數據存到 text 文檔,學習一下使用 mongoDB 。

  1. 安裝 mongoDB 網址:http://blog.csdn.net/polo_longsan/article/details/52430539

程序開始

import json
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException
from pyquery import PyQuery as pq
#import pymongo
#引入頭文件,注釋掉的是引入 mongodb,因為電腦連接不上mongodb,就不用了
#client = pymongo.MongoClient(MONGO_URL)
#db = client[MONGO_DB]

函數 search 前的是設置 browser, search 抓取首頁和發送淘寶搜索關鍵詞

chrome_options = Options()
#設置為 headless 模式,注釋掉就會彈出Google瀏覽器窗口顯示
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(executable_path=(r'C:\Users\libai\AppData\Local\Google\Chrome\Application\chromedriver.exe'), chrome_options=chrome_options)
#browser 中的地址是所下載的 chromdriver.exe  所放的位置,我把它放到了 chrome 安裝目錄下
wait = WebDriverWait(browser, 10)
def search():
    try:
        browser.get('https://www.taobao.com/')
        #用的是 CSS 選擇器
        inputs = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")))
        inputs.send_keys("美食")
        submit.click()
        total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")))
        result = int(re.compile("(\d\d\d)").search(total.text).group(1))
        get_products()
        return result
    except TimeoutException:
        search()
        #一旦超時,就重新調用 search

在抓取完頁面后, 跳下一頁,直接在 inputs 中輸入跳轉的頁面,點擊確定就行了

def next_page(page_number):
    try:
        inputs = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")))
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")))
        inputs.clear()
        inputs.send_keys(page_number)
        submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > ul > li.item.active > span"), str(page_number)))
        get_products()
    except TimeoutException:
        next_page(page_number)

獲取頁面詳細信息,使用 pyquery 提取頁面中的元素

def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist .items .item")))
    #等待頁面加載完成
    html = browser.page_source
    doc = pq(html)
    #.items() 函數屬性是提取多個
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image' : item.find('.pic .pic-link .img').attr("src"),
            'price' : item.find('.row .price').text().replace('\n', '') ,
            'deal' : item.find('.row .deal-cnt').text()[:-3],
            'title' : item.find('.title').text().replace('\n', ' '),
            'shop' : item.find('.shop').text(),
            'location' : item.find('.location').text()
        }
        print('---------------------------------')
        save_to_text(product)

存儲到 text 文件中,不加 encoding="UTF-8" ,會報編碼錯誤, json 格式更加便利于存取

def save_to_text(product):
    try:
        with open("product.txt", "a", encoding="UTF-8") as f:
            f.write(json.dumps(product) + '\n')
        print("寫入成功", product)
    except:
        print("寫入失敗", product)

主程序

def main():
    with open('product.txt', "w", encoding="UTF-8") as f:
        print("新建product.txt文件成功")
    total = search()
    print("一共有 " + str(total) + " 頁")

    for i in range(2, total):
        print("跳轉到第 %d 頁" %i)
        next_page(i)
    browser.close()


if __name__ == "__main__":
    main()

從 text 文件中讀取,再寫入到 mongoDB 數據庫中

import json
import pymongo


MONGO_URL = "localhost"
MONGO_DB = "taobao"
MONGO_TABLE = 'product'

client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

def openandsave(filename):

    file = open(filename) 
    while 1:
        lines = file.readlines(100000)
        if not lines:
            break
        for line in lines:
            print(json.loads(line))
            save_to_mongodb(json.loads(line))
            print('-----------------')
    file.close()

def save_to_mongodb(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('存儲到MONGODB成功', result)
    except:
        print('存儲到MONGODB失敗', result)

def main():
    filename = "product.txt"
    openandsave(filename)

if __name__ == '__main__':
    main()

看起來不是很對,有些細節的地方沒有調整好


2.png

數據庫圖片


3.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容