8.1 淘宝实战selinum代码完整

案例三:爬取淘宝)
1 mongodb打开方法之前讲过。+++
2  如果用requests的方式需要准备一定量的ip,所以此次采用selinum方式
3  注意此次使用pyquery解析,和前端挂钩。
--------------------------------------------------------------------------------


实战环节
爬取淘宝网有关“鞋子”的商品信息,并把爬取的数据存储在MongoDB数据库中(这里为了方便大家测试,只是把信息输出)
首先前往淘宝网;
分析搜索框的xpath语句,并send_keys(‘鞋子’);
分析页面,找到每条商品的信息,使用xpath提取数据并将其存储成字典的格式,输出该字典;
找到下一页的按钮,模拟点击它,并循环第3步,直到循环结束 。

文章参考链接必看[:](https://www.cnblogs.com/zhaof/p/6953241.html)[https://www.cnblogs.com/zhaof/p/6953241.html]

css基础 :#表示id ,.表示class

而淘宝页面上那个value是淘宝工程师做的一个下一页的预处理,而我们要获取的不是value,而是input,所以可以不用管

class=“A B”这代表有A和B两个类

img是标签,src是属性。记住
[图片上传失败...(image-1f67b4-1517580232269)]
补充学习链接:http://www.w3school.com.cn/html/html_css.asp

Suty 2018/2/1 22:33:30
怎么理解,row 是一个类,row—2 是一个类,title是一个类?
link


完整代码:
#! /usr/bin/env python
# -*- coding:utf-8 -*-

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 #EC.presence_of_element_located()是确认元素是否已经出现了或者可点击等
from selenium.common.exceptions import TimeoutException #异常处理,try exceptions
from pyquery import PyQuery as pq  #基于前端的解析代码的工具
import re  #正则表达式
from pymongo import MongoClient
from selenium.webdriver.common.keys import Keys

client = MongoClient()
db = client.taobao
yurongfu = db.yurongfu #创建羽绒服集合

driver = webdriver.Chrome() #打开Chrome浏览器,C要大写
wait = WebDriverWait(driver,10) #设置浏览器等待时间

#进入淘宝网,输入鞋子,返回页面
def search():
    try:
        driver.get('https://www.taobao.com/')
        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(u'羽绒服') #输入羽绒服
        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 TimeoutException:
        return search()

#跳转到下一页
def next_page(page_number):
    try:
        input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))) #相当于input这个页码输入框输入了page_number
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))) #定位确定按钮
        input.clear() #clear() 函数用于删除字典内所有元素
        input.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)

#得到淘宝商品信息
def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
    html = driver.page_source
    doc = pq(html)
    #pyquery (driver.page_source)就相当于requests.get获取的内容
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image':item.find('.pic .img').attr('src'),#用这个类代表这个标签
            'price':item.find('.price').text(),
            'deal':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        yurongfu.insert(product)

def main():  #定义主函数
    total = search()
    total= int(re.compile('(\d+)').search(total).group(1))
        #爬取所有的数据时,把10替换为total+1
    for i in range(1,10):
        next_page(i)

if __name__ == '__main__':
    main()


你可能感兴趣的:(8.1 淘宝实战selinum代码完整)