python我爱编程

【Python】03-使用Selenium+Pyquery爬取淘

2018-05-29  本文已影响97人  b861a75d2a7d

需求分析:

需求分析

1.先做好准备工作,导入要用到的模块。

from selenium import webdriver
from pyquery import PyQuery as  pq
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from config import *
import pymongo

2.初始化浏览器和设置需要用的mongodb数据库。

#如果不想打开浏览器就可以执行代码,可以这样设置
# option = webdriver.ChromeOptions()
# option.add_argument("headless")
# driver = webdriver.Chrome(chrome_options=option)

#初始化浏览器为谷歌浏览器
browser =webdriver.Chrome()
#设置等待时间
wait = WebDriverWait(browser,10)
#设置数据库参数
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

3.为了方便使用mongodb数据库储存爬取下来的信息,还需要创建一个配置文件:config.py。

下面是config.py中的代码:

#数据库地址
MONGO_URL = 'localhost'
#存储的数据库名称
MONGO_DB = 'taobao'
#表名称
MONGO_TABLE= 'result'

下面开始正式的代码编写:

4.定义一个搜索函数,用于打开淘宝首页,并搜索指定关键词语。

def search(key_word):
    try:
        browser.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(key_word)
        #点击搜索按钮
        submit.click()
        # 得到页面总页数,并返回,为后面设置翻页做准备
        page_count = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
        #get_info()是获取我们的信息的一个方法
        get_info()
        return page_count.text

    except Exception:
        print('出现错误,重新请求页面')
        search(key_word)

5.上面的函数,只可以跳转到搜索结果的第一页就结束了,所有我们还需要一个函数,用来帮助我们翻页。

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')))
        #翻页 确定 按钮
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
        #清空页码输入框
        input.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_info()是获取我们的信息的一个方法
        get_info()
    except Exception:
        #如果发生错误,重新发起请求
        next_page(page_number)

6.使用Pyquery获取每页的商品信息。

def get_info():
    '''通过selenium中的page_soure方法获取页面源码,然后使用pyquery库解析,提取关键信息'''
    #获取商品信息之前,我们需要判断商品信息是否加载完成
    wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist > div > div')))
    #使用selenium中的page_source方法获取页面源码
    html = browser.page_source
    #使用Pyquery解析源代码,在导入方法的时候,我们已经给Pyquery()设置了别名pq,所以这里是pq
    html = pq(html)
    # 找到商品的节点,并使用items()方法,返回列表形式的键值对
    items = html('#mainsrp-itemlist .items .item').items()
    #遍历获取商品信息
    for item in items:
        item = {
            #商品主图
            'image':item.find('.pic .img').attr('src'),
            #商品价格
            'price ':item.find('.price ').text(),
            #人气
            'popularity':item.find('.deal-cnt').text(),
            #商品标题
            'title':item.find('.title').text(),
            #店铺名称
            'shop':item.find('.shop').text(),
            #商家的地区
            'location':item.find('.location').text()
        }
        print(item)
        #save_to_mogodb()是一个把数据存储到mongodb数据库的方法,接下里我们就要定义这一个函数
        save_to_mogodb(item)

7.使用mongodb数据库存储我们获取到的数据。

def save_to_mogodb(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('保存mongo成功')
    except Exception:
        print('存储失败',result)

8.万事俱备只欠东风,所有的准备工作都已经完成的情况下,我们还需要一个主函数,把所有的方法组合起来,完成一系列的工作。

def main(key_word):
    #首先使用搜索函数,把总页数返回
    page_count = search(key_word)
    # 在通过正则表达式,把返回的信息“共 100 页”中的数字提取出来
    page_count = int(re.compile('(\d+)').search(page_count).group(1))
    #通过range()方法生成所有页码
    #因为第1页我们已经获取了,所有这里翻页从第2页开始
    for i in range(2,page_count+1):
        next_page(i)

if __name__ == '__main__':
    main('健身')

9.接下来我们让程序跑起来就OK了。

Github下载地址
配置文件config.py
注意:配置文件config.py需要一起下载。


参考文档:

1.静觅 » [Python3网络爬虫开发实战] 7.1-Selenium的使用

2.静觅 » [Python3网络爬虫开发实战] 7.4-使用Selenium爬取淘宝商品

3.静觅 » [Python3网络爬虫开发实战] 4.3-使用pyquery


上一篇下一篇

猜你喜欢

热点阅读