這里用淘寶來練習(xí)一下 selenium 的使用,可以替換關(guān)鍵字环鲤,爬取不同的物品纯趋,比如說衣服、鞋子之類的冷离。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from pyquery import PyQuery as pq
import re,pymongo
borwser = webdriver.Chrome()#聲明瀏覽器
url = 'https://www.taobao.com/'
wait = WebDriverWait(borwser,10)#顯示等待
key_word = '美食'
def search(key_word):
try:
borwser.get(url)
input = 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')))
input.send_keys(key_word)
submit.click()
total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager>div>div>div>div.total')))
get_products()
return total.text
except TimeoutError:
return search(key_word)
這一部分主要是一些配置的信息吵冒,打開淘寶,找到輸入框西剥,然后輸入關(guān)鍵字確定痹栖,如果在規(guī)定的時間內(nèi)沒有響應(yīng),可能是網(wǎng)速太慢瞭空,我們用了遞歸調(diào)用再次執(zhí)行代碼就好了揪阿。
def next_page(number):
#處理翻頁的操作
#頁面最下方翻頁地方輸入頁碼的框出來沒有
input = 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')))
input.clear()#先清理一下輸入框里的頁碼數(shù)字
input.send_keys(number)#填入翻頁數(shù)字
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(number)))
get_products()
這一部分是處理翻頁的,代碼注釋已經(jīng)很詳細(xì)了咆畏,不再過多啰嗦南捂。
def get_products():
#解析詳情列表
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))#看看頁面加載出來沒有
html = borwser.page_source#得到網(wǎng)頁的源代碼
doc = pq(html)#用pq解析網(wǎng)頁源代碼
#得到所有選中的內(nèi)容
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
products = {
'image': item.find('.pic .img').attr('data-src'),
'price': item.find('.price').text()[3:],
'deal': item.find('.deal-cnt').text(),
'title': item.find('.title').text(),
'shop': item.find('.shop').text(),
'location': item.find('.location').text()
}
print(products)
save_products(products)
這里是解析頁面美食部分的代碼,當(dāng)然你的關(guān)鍵字是什么就解析什么旧找,這里用到了 pyquery 這個庫溺健,你也可以使用其他的解析方法,比如說 xpath 钮蛛、re 鞭缭、bs4 等等
MONGO_URL = 'localhost'#本地數(shù)據(jù)庫
MONGO_DB = 'taobaomeishi'#數(shù)據(jù)庫名稱
MONGO_TABLE = 'products'
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
def save_products(result):
try:
if db[MONGO_TABLE].insert(result):
print('保存MONGODB成功',result)
except Exception:
print('保存到MONGODB失敗',result)
if __name__ == '__main__':
total = search(key_word)
total = int(re.findall('(\d+)',total)[0])
for i in range(2,5):
next_page(i)
覺得不錯點個贊吧。