from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from pyquery import PyQuery as pq
import pymongo
browser=webdriver.Chrome()
wait = WebDriverWait(browser, 10)
KEYWORD="ipad" #所要爬去的对象
MONGO_URL="localhost" #数据库的连接
MONGO_DB="taobao" #数据库的连接
MONGO_COLLECTION="products" #数据库的连接
client=pymongo.MongoClient(MONGO_URL) #数据库的连接
db=client[MONGO_DB] #数据库的连接
MAX_PAGE=3 #设置爬去的页数
def index_page(page):
print("正在爬去弟",page,"页")
url="https://s.taobao.com/search?q="+quote(KEYWORD) #爬取的网址 他与动态界面不一样所以一个网址即可
browser.get(url) #获取网页的源代码
if page>1: #判断当前的页数是否为第一页
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager .input')))
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager .J_Submit')))
'''
input= browser.find_element_by_css_selector("#mainsrp-pager .J_Input")
submit=browser.find_element_by_css_selector("#mainsrp-pager .J_Submit")
#这里主要是对按钮确定的查找与页码的输入,用任何选择器都可以
'''
input.clear() #对页码区域清空
input.send_keys(page) #对页码区域的重写
submit.click() #点击确定按钮
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page)))
'''
这里十分重要主要在于网页的爬取速度远远大于网页的打开速度所以运用此函数去确认网页是否打开,
只有打开了才能爬取正确结果,为什么按自己的思路爬取的时候会发生这个原因在这里
'''
get_products()
def get_products():
html=browser.page_source #获取源代码
doc=pq(html) #使用pyquery库解析网页,即css选择器用什么都可以
items=doc("#mainsrp-itemlist .items .item").items()
for item in items:
product={
"image":item.find('.pic .img').attr("data-src"),
"price":item.find(".price").text(),
"deal":item.find(".deal-cnt").text(),
"title":item.find(".title").text(),
"shop":item.find(".shop").text(),
"location":item.find("location").text()
} #对商品信息的查询
print(product)
save_to_mongo(product)
def save_to_mongo(result): #数据库的存储
"""
保存至MongoDB
:param result: 结果
"""
try:
if db[MONGO_COLLECTION].insert(result):
print('存储到MongoDB成功')
except Exception:
print('存储到MongoDB失败')
def main():
for i in range(1, MAX_PAGE + 1):
index_page(i)
if __name__ == '__main__':
main()