使用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

  

posted @ 2018-10-11 18:35  宋讼颂  阅读(369)  评论(0编辑  收藏  举报