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