zoukankan      html  css  js  c++  java
  • 使用selenium+chrome/PhantomJS抓取博客园文章

    闲来无事,抓一下博客园的文章玩玩,当然,不会暴力抓取,每天就抓10条就好。

    先前抓美团数据时因为抓的太快,ip被ban掉了,所以这次就搞了个selenium来模拟点击,纯属娱乐。

    上代码:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2018/9/26 14:38
    # @Author  : Sa.Song
    # @Desc    : 循环请求博客园下https://www.cnblogs.com/cate/python/页面,处理页面得到所有title标签列表,使用selenium + Chrome模拟点击获取正文
    # @File    : cnblogs.py
    # @Software: PyCharm
    
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from lxml import etree
    
    
    url = 'https://www.cnblogs.com/cate/python/'
    title_num = 5
    for i in range(title_num):
        chrome_options = Options()
        chrome_options.add_argument('lang=zh_CN.UTF-8')  # 设置文字编码
        chrome_options.add_argument('--headless')  # 不显式的打开浏览器
        prefs = {
            'profile.default_content_setting_values':{
                'images':2,
            }
        }
        # 设置禁止加载图片
        chrome_options.add_experimental_option('prefs', prefs)
        browser = webdriver.Chrome(chrome_options=chrome_options)
        browser.get(url=url)
        time.sleep(3)
        # 获取到请求页面的所有博客标题所在的标签
        title_list = browser.find_elements_by_xpath('//div[@id="post_list"]/div[@class="post_item"]/div[@class="post_item_body"]/h3/a')
        title_list[i].click()  #点击选中的标签
        time.sleep(3)
        message_url = browser.current_url  # 获取当前访问页面的url
        html = browser.page_source  # 获取当前访问页面的内容(所见即所得)
        html = etree.HTML(html)  # 处理得到的html,使其可以xpath
        title = html.xpath('//a[@id="cb_post_title_url"]/text()')[0]  # 获取文章标题
        message = html.xpath('//div[@id="cnblogs_post_body"]')[0]  # 获取正文的富文本标签
        # 获得的message为:<Element div at 0x1c47517d4c8>,使用etree.tostring()获得其中的富文本标签,得到bytes类型数据,再decode()
        data = etree.tostring(message).decode('utf-8')
        print('访问:', message_url)
        print('标题:', title)
        browser.close()

    上边的代码时跑在windos下的,如果想要跑在linux下,Chrome会比较复杂,配置PhantomJS比较简单,其实代码基本一样:

    Linux下Python3环境安装selenium跟phantomjs

    环境安装:

      前提是安装好了python3

      先安装依赖包:

         sudo yum install build-essential g++ flex bison gperf ruby perl libsqlite3-dev libfontconfig1-dev libicu-dev libfreetype6 libssl-dev libpng-dev libjpeg-dev python libx11-dev libxext-dev 

      获取PhantomJS:

         wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2

      解压并且创建软连接:

        tar -xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2
        sudo cp -R phantomjs-2.1.1-linux-x86_64 /usr/local/share/
        sudo ln -sf /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/

      安装selenium:

        pip3 insatll selenium

      安装完成后上代码:

    # -*- coding: utf-8 -*-
    # @Time    : 2018/9/26 14:38
    # @Author  : Sa.Song
    # @Desc    : 循环请求博客园下https://www.cnblogs.com/cate/python/页面,处理页面得到所有title标签列表,使用selenium + Chrome模拟点击获取正文
    # @File    : cnblogs.py
    # @Software: PyCharm
    
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from lxml import etree
    
    
    url = 'https://www.cnblogs.com/cate/python/'
    title_num = 5
    for i in range(title_num):
    
        browser = webdriver.PhantomJS()
        browser.get(url=url)
        time.sleep(3)
        # 获取到请求页面的所有博客标题所在的标签
        title_list = browser.find_elements_by_xpath('//div[@id="post_list"]/div[@class="post_item"]/div[@class="post_item_body"]/h3/a')
        title_list[i].click()  #点击选中的标签
        time.sleep(3)
        message_url = browser.current_url  # 获取当前访问页面的url
        html = browser.page_source  # 获取当前访问页面的内容(所见即所得)
        html = etree.HTML(html)  # 处理得到的html,使其可以xpath
        title = html.xpath('//a[@id="cb_post_title_url"]/text()')[0]  # 获取文章标题
        message = html.xpath('//div[@id="cnblogs_post_body"]')[0]  # 获取正文的富文本标签
        # 获得的message为:<Element div at 0x1c47517d4c8>,使用etree.tostring()获得其中的富文本标签,得到bytes类型数据,再decode()
        data = etree.tostring(message).decode('utf-8')
        print('访问:', message_url)
        print('标题:', title)
        with open('message.html', 'a+', encoding='utf-8') as f:
            f.write(data)

    ps: 正文获取的是富文本标签(投机取巧了)

    想了解更多Python关于爬虫、数据分析的内容,欢迎大家关注我的微信公众号:悟道Python

      

  • 相关阅读:
    WMS、WCS、PLC、AGV
    SAP消息号修改汇总
    SQL 计算累计和 sum() over( partition by order by )
    DDLS报错数据类型冲突:data type conflict in a selection 解决办法
    SAP销售订单需求类型的确定优先级
    SAP替代,出口U904在RGGBS000中未生成
    订单BOM与销售BOM的区别
    在配置和销售凭证 GET_CONFIG_MODE 间通信时内部出错
    ABAP Write
    php的api接口
  • 原文地址:https://www.cnblogs.com/ss-py/p/9774281.html
Copyright © 2011-2022 走看看