• 使用Selenium模拟浏览器抓取淘宝商品美食信息


    1.搜索关键词:利用Selenium驱动浏览器,得到商品列表。

    2.分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表。

    3.分析提取商品内容:利用PyQuery分析源码,解析得到商品列表。

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

    spider.py

     1 from selenium import webdriver
     2 from selenium.common.exceptions import TimeoutException
     3 from selenium.webdriver.common.by import By
     4 from selenium.webdriver.support.ui import WebDriverWait
     5 from selenium.webdriver.support import expected_conditions as EC
     6 import re
     7 from pyquery import PyQuery as pq
     8 from urllib.parse import quote
     9 import pymongo
    10 from config import *
    11 
    12 client = pymongo.MongoClient(MONGO_URL)
    13 db = client[MONGO_DB]
    14 browser = webdriver.Chrome()
    15 wait = WebDriverWait(browser, 10)
    16 
    17 def search():
    18     try:
    19         browser.get('https://www.taobao.com')
    20         input = wait.until(
    21             EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
    22         )
    23         submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
    24         input.send_keys('美食')
    25         submit.click()
    26         total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
    27         get_products()
    28         return total.text
    29     except TimeoutEXception:
    30         return search()
    31 
    32 def next_page(page_number):
    33     try:
    34         input = wait.until(
    35             EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
    36         )
    37         submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
    38         input.clear()
    39         input.send_keys(page_number)
    40         submit.click()
    41         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)))
    42         get_products()
    43     except TimeoutException:
    44         next_page(page_number)
    45 
    46 def get_products():
    47     wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
    48     html = browser.page_source
    49     doc = pq(html)
    50     items = doc('#mainsrp-itemlist .items .item').items()
    51     for item in items:
    52         product = {
    53             'image': item.find('.pic .img').attr('src'),
    54             'price': item.find('.price').text(),
    55             'deal': item.find('.deal-cnt').text()[:-3],
    56             'title': item.find('.title').text(),
    57             'shop': item.find('.shop').text(),
    58             'location': item.find('.location').text()
    59         }
    60         print(product)
    61         save_to_mongo(product)
    62 
    63 def save_to_mongo(result):
    64     try:
    65         if db[MONGO_TABLE].insert(result):
    66             print('保存MONGOBD成功',result)
    67     except Exception:
    68         print('存储到MONGODB失败',result)
    69 
    70 def main():
    71     total = search()
    72     total = int(re.compile('(d+)').search(total).group(1))
    73     for i in range(2,total+1):
    74         next_page(i)
    75     browser.close()
    76 
    77 if __name__ == '__main__':
    78     main()

    config.py

    1 MONGO_URL = 'localhost'
    2 MONGO_DB = 'taobao'
    3 MONGO_TABLE = 'products'

    从Chrome 59版本开始,已经开始支持Headless模式,也就是无界面模式,这样爬取的时候就不会弹出浏览器了。如果要使用此模式,请把Chrome升级到59版本及以上。启用Headless模式的方式如下:

    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    browser = webdriver.Chrome(chrome_options=chrome_options)

    首先,创建ChromeOptions对象,接着添加headless参数,然后在初始化Chrome对象的时候通过chrome_options传递这个ChromeOptions对象,这样我们就可以成功启用Chrome的Headless模式了。

    要对接Firefox浏览器,非常简单,只需要更改一处即可:

    browser = webdriver.Firefox()

    这里更改了browser对象的创建方式,这样爬取的时候就会使用Firefox浏览器了。

    如果不想使用Chrome的Headless模式,还可以使用PhantomJS(它是一个无界面浏览器)来抓取。抓取时,同样不会弹出窗口,还是只需要将WebDriver的声明修改一下即可:

    修改代码:

    client = pymongo.MongoClient(MONGO_URL)
    db = client[MONGO_DB]
    #browser = webdriver.Chrome()
    browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
    wait = WebDriverWait(browser, 10)
    browser.set_window_size(1400, 900)

     另外,它还支持命令行配置。比如,可以设置缓存和禁用图片加载的功能,进一步提高爬取效率:

    MONGO_URL = 'localhost'
    MONGO_DB = 'taobao'
    MONGO_TABLE = 'products'
    
    SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
  • 相关阅读:
    matplotlib的使用——scatter散点图的绘制
    OpenCVPython系列之立体图像的深度图
    YOLOv3 cfg文件详解
    Opencv的使用小教程2——Opencv常用图像处理函数汇总
    数字世界中的纸张——理解 PDF
    go channel初步
    Unity学习记录 导航
    elasticsearch的keyword与text的区别
    markdownitcontainer
    Windows 编译opensll
  • 原文地址:https://www.cnblogs.com/wanglinjie/p/9114218.html
Copyright © 2020-2023  润新知