zoukankan      html  css  js  c++  java
  • 使用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']
  • 相关阅读:
    Zookeeper之 为什么最好是奇数台机器?
    Kafka 之 如何高吞吐和低延迟
    hbase 之 rowkey的设计
    Zookeeper之 两种选举制度|为什么需要过半投票机制?
    Mysql 之 union和union all
    Mysql之 distinct & null | distinct 调优
    Linux 之 系统资源命令
    Linux 之 vi 之 快速定位到n line
    Zeppelin问题 之 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
    springboot项目中进行XSS过滤
  • 原文地址:https://www.cnblogs.com/wanglinjie/p/9114218.html
Copyright © 2011-2022 走看看