目前解决不了图形滑块验证问题,继续努力随时更新
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 #等待条件为expected_conditions显示等待
from selenium.webdriver.support.wait import WebDriverWait #指定最长时间
from urllib.parse import quote #转化成URL需要的编码格式
from pyquery import PyQuery as pq #解析库
import pymongo #连接mongo数据库
browser = webdriver.Chrome()
wait=WebDriverWait(browser,10) #指定最长时间为10s
KEYWORD='iPad'
MONGO_DB='taobao'
MONGO_COLLECTION='products'
client=pymongo.MongoClient(host='localhost',port=27017) #创建数据库需要使用MongoClient对象以及url地址
db=client[MONGO_DB] #数据库名
MAX_PAGE=100
def index_page(page):
print('正在抓取第',page,'页')
try:
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 div.form>input'))) #调用until方法,显示等待中条件为presence_of_all_elements_located(等待节点加载出来,定位它),css选择器,选择#mainsrp-pager div.form>input(选择id=mainsrp-pager,然后选择以class=form的div节点为父节点的input节点)的节点搜索框
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager div.form>span.btn.J_Submit'))) #element_to_be_clickable(节点可以点击)道理同上
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))) #选择高亮的页码数,判断它是否等于我们所跳转的页数(str(page))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.m-itemlist .items .item'))) #寻找每一个商品框,item与之后的内容间隔一个空格,所以选择的时候class属性直接指定为item
get_products()
except TimeoutException:
index_page(page)
def get_products():
html=browser.page_source #page_sorce获取网页源代码
doc=pq(html)
items=doc('#mainsrp-itemlist .items .item').items() #多个item节点存在需要遍历,items()方法会得到一个有关item节点的生成器
for item in items:
product={
'image':item.find('.pic .J_ItemPic.img').attr('data-src'),
'price':item.find('.price.g_price.g_price-highlight').text().replace('\n',' '),
'deal':item.find('.deal-cnt').text(),
'title':item.find('.row.row-2.title').text().replace('\n',' '),
'shop':item.find('.shop').text(),
'location':item.find('.locayion').text()
}
print(product)
save_to_mongo(product)
def save_to_mongo(result):
try:
if db[MONGO_COLLECTION].insert_one(result):
print('储存到MongoDB成功')
except:
print('储存到MongoDB失败')
def main():
for i in range(1,MAX_PAGE+1):
index_page(i)
browser.close()
if __name__ == '__main__':
main()