selenium+phantomjs爬取京東商品信息 今天自己實戰寫了個爬取京東商品信息,和上一篇的思路一樣,附上鏈接:https://www.cnblogs.com/cany/p/10897618.html 打開 https://www.jd.com/ 首先不需要登陸就可搜索,淘寶不一樣,所以淘寶 ...
selenium+phantomjs爬取京東商品信息
今天自己實戰寫了個爬取京東商品信息,和上一篇的思路一樣,附上鏈接:https://www.cnblogs.com/cany/p/10897618.html
打開 https://www.jd.com/ 首先不需要登陸就可搜索,淘寶不一樣,所以淘寶我還沒試過。
開啟F12 定位一下搜索框和搜索按鈕
input = WAIT.until(EC.presence_of_element_located((By.XPATH,'//*[@id="key"]')))
submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="search"]/div/div[2]/button')))
input.send_keys(goods)
submit.click()
接下來我們要的是按銷量排名,那就要點擊這個 onclick事件
發現使用click()還是無法進行點擊,因為這是個js跳轉 所以得用下麵代碼
submit_js = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_filter"]/div[1]/div[1]/a[2]')))
browser.execute_script("$(arguments[0]).click()", submit_js)
接下來就還是檢測是否載入了下麵的元素
開始分析各項 怎麼獲取裡面的數據就不說了
這時候可能爬的不完全,因為京東是動態載入的 需要去模擬一下把頁面拉到底部
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
按照這樣子進行迴圈遍歷,把每一個值添加到goods_data列表裡去,但也保證不了可能會出現找不到對象的屬性,拋出AttributeError異常,這裡已經嘗試過了,所以寫下這個異常處理!
然後獲取完一頁就下一頁,然後得寫個代碼來檢查是否跳轉到指定頁面
WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_num)))
再獲取每一頁當前頁面源碼進行解析提取內容,保存到 goods_data 列表中,最後寫入xls文件!
Tips:裡面sleep 時間視情況而定,太快會導致獲取不全,但如果網速快能彌補這一點,目前測試情況來看是這樣子的問題!
附上代碼:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import xlwt
import time
goods = input('請輸入你要爬取的商品名稱:')
goods_data = []
browser = webdriver.PhantomJS()
WAIT = WebDriverWait(browser,10)
browser.set_window_size(1000,600)
def seach(goods):
try:
print('開始自動化爬取京東商品信息......')
browser.get('https://www.jd.com/')
input = WAIT.until(EC.presence_of_element_located((By.XPATH,'//*[@id="key"]')))
submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="search"]/div/div[2]/button')))
input.send_keys(goods)
submit.click()
submit_js = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_filter"]/div[1]/div[1]/a[2]')))
browser.execute_script("$(arguments[0]).click()", submit_js)
time.sleep(1)
get_source()
except TimeoutException:
return seach(goods)
def get_source():
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(1)
WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList > ul')))
html = browser.page_source
soup = BeautifulSoup(html,'lxml')
save_data(soup)
def save_data(soup):
html = soup.find_all(class_='gl-i-wrap')
for item in html:
try:
goods_name = item.find(class_='p-name').find('em').text
goods_link = 'https:' + item.find(class_='p-img').find('a').get('href')
goods_evaluate = item.find(class_='p-commit').text
goods_store = item.find(class_='curr-shop').text
goods_money = item.find(class_='p-price').find('i').text
print(('爬取: ' + goods_name))
goods_data.append([goods_name,goods_link,goods_evaluate,goods_store,goods_money])
except AttributeError:
pass
def next_page(page_num):
try:
print('獲取下一頁數據')
next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.pn-next')))
next_btn.click()
WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_num)))
get_source()
except TimeoutException:
browser.refresh()
return next_page(page_num)
def save_to_excel():
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet(goods, cell_overwrite_ok=True)
sheet.col(0).width = 256 * 80
sheet.col(1).width = 256 * 40
sheet.col(2).width = 256 * 20
sheet.col(3).width = 256 * 25
sheet.col(4).width = 256 * 20
sheet.write(0, 0, '商品名稱')
sheet.write(0, 1, '商品鏈接')
sheet.write(0, 2, '評價人數')
sheet.write(0, 3, '店名')
sheet.write(0, 4, '價格')
for item in goods_data:
n = goods_data.index(item) + 1
sheet.write(n, 0, item[0])
sheet.write(n, 1, item[1])
sheet.write(n, 2, item[2])
sheet.write(n, 3, item[3])
sheet.write(n, 4, item[4])
book.save(str(goods) + u'.xls')
def main():
try:
seach(goods)
for i in range(2,11):
next_page(i)
print('-'*50)
print('數據爬取完畢,正在寫入xls.....')
save_to_excel()
print('寫入成功!!!')
finally:
browser.close()
browser.quit()
if __name__ == '__main__':
main()