• Selenium模拟浏览器抓取淘宝美食信息


    前言:

    无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到selenium的神奇之处,关键是虽然对小白来说信息量很大,但是讲得特别清楚,不亚于培训班哈哈哈哈。接下来言归正传。

    使用Selenium模拟浏览器抓取淘宝美食信息并保存到MongoDB数据库,流程如下:

    1、利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。

    2、得到商品页码数,模拟翻页,得到后续页面的商品列表。

    3、利用PyQuery分析源码,解析得到商品列表。

    4、将商品列表信息存储到数据库MongoDB。

    环境:

    win64位系统,python3.6,IDE为pycharm,已经安装MongoDB数据库,Selenium,chrome63版本以及chromedriver2.34版本。

    预备知识:

    首先就是selenium。。(本人还不会啊,要赶紧学了!),然后要会用CSS选择器,pyquery库(抓网页信息很好用),re正则表达式(必须会),以及MongoDB数据库等等。

    代码:

    这里需要pycharm在目录下新建一个项目,然后建两个py文件,一个是spider爬虫,另一个是config用来放MongoDB的一些信息,先是spider

    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.common.exceptions import TimeoutException
    import regex as re
    from pyquery import PyQuery as pq
    from config import *
    import pymongo
    
    client = pymongo.MongoClient(MONGO_URL)
    db = client[MONGO_DB]
    browser = webdriver.Chrome()
    #browser = webdriver.Chrome(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'])
    wait = WebDriverWait(browser,10)
    
    def search():
        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('美食')
            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'))
            )
            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_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 = browser.page_source
        doc = pq(html)
        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)
            save_to_mongo(product)
    
    def save_to_mongo(result):
        try:
            if db[MONGO_TABLE].insert(result):
                print('存储成功',result)
        except Exception:
            print('存储失败',result)
    
    def main():
        total = search()
        total = int(re.findall('(d+)',total)[0])
        #print(total)
        for i in range(2,total+1):
            next_page(i)
    
    if __name__ == '__main__':
        main()

    然后是config

    MONGO_URL = 'localhost'
    MONGO_DB = 'taobao'
    MONGO_TABLE = 'product'

    先放着,等入门selenium之后再来注释,另外还可以用PhantomJS来代替Chrome,之后也会学习并且修改代码

    人生苦短,何不用python
  • 相关阅读:
    [esp8266]RAM不足问题,导致重启
    在windows上使用ubuntu(非虚拟机模式)
    [RPAPython]自动化脚本入门使用1
    交叉编译openmv源码(ubuntu)
    springboot bean的生命周期
    转,记一次freessl免费ssl证书申请
    使用httpproxymiddleware中间件代理请求实现跨域方法
    win7 node 高版本 问题
    js JavaScript 对象属性特征 访问器 set get setter getter 红宝书第四版
    windows 环境变量 编辑工具
  • 原文地址:https://www.cnblogs.com/yqpy/p/8309759.html
Copyright © 2020-2023  润新知