selenium+BeautifulSoup+phantomjs爬取新浪新闻
一 下载phantomjs,把phantomjs.exe的文件路径加到环境变量中,也可以phantomjs.exe拷贝到一个已存在的环境变量路径中,比如我用的anaconda,我把phantomjs.exe文件加入到了Anaconda3这个文件夹中(Anaconda3已加入环境变量)
二 pip安装selenium+BeautifulSoup+phantomjs 命令pip install selenium,anaconda中已有BeautifulSoup,不用管
三 爬取数据,目标是爬取新浪新闻下的公司下面的所有的新闻文本。如图是新闻文章的列表,我们首先要抓取文章对用的链接,然后进入链接抓取文本


由于采用的是js加载的,如果直接用beautifulsoup是解析不出的,这里采用selenium+phantomjs抓取。抓取的思路是首先模拟点击公司新闻按钮,进入公司新闻栏目下,抓取该页所有新闻文章对应的链接,然后点击模拟点击下一页进入下一页循环抓取
下面是粗糙的代码实现:
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
import time
def get_links(driver):
'''
爬取链接并写入txt中
'''
t1 = time.time()
try:
driver.find_element(By.LINK_TEXT, "下一页").click()#每爬取完一页点击下一页
except NoSuchElementException:
time.sleep(1)
driver.find_element(By.LINK_TEXT, "下5页").click()#有可能遇到没有下一页,尝试点击下5页
time.sleep(1)
bs = BeautifulSoup(driver.page_source)#不知道怎么用selenium直接解析出href。把selenium的webdriver调用page_source函数在传入BeautifulSoup中,就可以用BeautifulSoup解析网页了
links = []
for i in bs.findAll('a',href=re.compile("http://finance.sina.com.cn/chanjing/gsnews/.")):#用正则表达式找出所有需要的链接
link = i.get('href')
if link not in links:#去掉重复链接
links.append(link)
f.write(link+'\n')
t2 = time.time()
page_num = bs.find('span',{'class','pagebox_num_nonce'}).text#找出当前页数
page_num = int(page_num)
if page_num>4:
return
print('爬取完第%d页,用时%d秒'%(page_num,t2-t1))
get_links(driver) def get_text(links,path):
'''
解析出所需文本,第一个参数为链接列表,第二个为保存路径
'''
n=0
for link in links:
html = urlopen(link)
bsObj = BeautifulSoup(html)
temp = ''
try:
for link in bsObj.find("div",{'id':re.compile('artibody')}).findAll('p'):
temp = temp+link.text.strip()#把每一段都拼接在一起
print(temp[:31])
path.write(temp+'\n')
n+=1
print('爬取完第%d篇'%n)
print('\n')
except (AttributeError,UnicodeEncodeError,UnicodeEncodeError):#这里的处理可能有点暴力
continue if True:#我把爬取的链接保存了下,所分成了两部,第一次爬取链接,第二次爬取文本
f = open('E:\hei.txt','w')
driver = webdriver.PhantomJS()#如果phantomjs.exe所在路径没有加入环境变量,这里也可以直接把其路径作为参数传给PhantomJS()
driver.get("http://finance.sina.com.cn/chanjing/")
driver.find_element(By.LINK_TEXT, "公司新闻").click()
time.sleep(2)
get_links(driver)
f.close()
driver.close() if True:#爬取文本
xl = open('E:\heiii.txt','w')
with open('E:\heii.txt') as f:
links = [link.strip() for link in f]
get_text(links,xl)
selenium+BeautifulSoup+phantomjs爬取新浪新闻的更多相关文章
- python3爬虫-爬取新浪新闻首页所有新闻标题
准备工作:安装requests和BeautifulSoup4.打开cmd,输入如下命令 pip install requests pip install BeautifulSoup4 打开我们要爬取的 ...
- Python3:爬取新浪、网易、今日头条、UC四大网站新闻标题及内容
Python3:爬取新浪.网易.今日头条.UC四大网站新闻标题及内容 以爬取相应网站的社会新闻内容为例: 一.新浪: 新浪网的新闻比较好爬取,我是用BeautifulSoup直接解析的,它并没有使用J ...
- Python 爬虫实例(7)—— 爬取 新浪军事新闻
我们打开新浪新闻,看到页面如下,首先去爬取一级 url,图片中蓝色圆圈部分 第二zh张图片,显示需要分页, 源代码: # coding:utf-8 import json import redis i ...
- 【转】Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- php使用pthreads v3多线程的抓取新浪新闻信息
我们使用pthreads,来写一个多线程的抓取页面小程序,把结果存到数据库里. 数据表结构如下: CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT ...
- python2.7 爬虫初体验爬取新浪国内新闻_20161130
python2.7 爬虫初学习 模块:BeautifulSoup requests 1.获取新浪国内新闻标题 2.获取新闻url 3.还没想好,想法是把第2步的url 获取到下载网页源代码 再去分析源 ...
- python爬取新浪股票数据—绘图【原创分享】
目标:不做蜡烛图,只用折线图绘图,绘出四条线之间的关系. 注:未使用接口,仅爬虫学习,不做任何违法操作. """ 新浪财经,爬取历史股票数据 ""&q ...
- python3使用requests爬取新浪热门微博
微博登录的实现代码来源:https://gist.github.com/mrluanma/3621775 相关环境 使用的python3.4,发现配置好环境后可以直接使用pip easy_instal ...
随机推荐
- HDU 4983 Goffi and GCD
题目大意:给你N和K,问有多少个数对满足gcd(N-A,N)*gcd(N-B,N)=N^K.题解:由于 gcd(a, N) <= N,于是 K>2 都是无解,K=2 只有一个解 A=B=N ...
- speex 回声消除的用法
speex 回声消除的用法 分类: speex AEC 回声消除 2012-11-13 11:24 1336人阅读 评论(0) 收藏 举报 speex的回声消息 就是speex_echo_cancel ...
- VS2010/MFC对话框:消息对话框
消息对话框 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中经常用到消息对话框,所以MFC提供了两个函数可以直接生成指定风格的消息对话框,而不 ...
- Android学习路线(二十)运用Fragment构建动态UI
要在Android系统上创建一个动态或者多面板的用户界面,你须要将UI组件以及activity行为封装成模块.让它可以在你的activity中灵活地切换显示与隐藏. 你可以使用Fragment类来创建 ...
- cocos android分析
来自:http://xiebaochun.github.io/ cocos2d-x Android环境搭建 cocos2d-x环境搭建比較简单,可是小问题还是不少,我尽量都涵盖的全面一些. 下载软件 ...
- mvc 防止客服端多次提交
但凡web开发中都会有户多次点击了提交按钮导致多次提交的情况,一般的集中做法 1.通过js在用户点击的时候将按钮disabled掉,但是这样并不是很可靠(我就可以跳过这个,用一个for循环 我直接自己 ...
- 【转】adb.exe,start-server' failed -- run manually if necessary
[转]Android adb.exe程序启动不起来,如何处理 解决问题: 百度google大家多说的是任务管理器 kill掉adb 或者重启adb server,但我任务管理器就没有adb ,猜测是某 ...
- 关于反射的一个小问题---.NetFrameWork版本不一样导致不同的系统的问题
背景: 近期项目中用到发射,本人的电脑上是安装了.NetFrameWork 4.5,然后用着发射蛮顺溜的,啪啪,三下五除二,项目完成了,然后提交测试了,测试的电脑是虚拟机上安装了xp系统,然后.Net ...
- 如何隐藏DLL中,导出函数的名称?(转)
如何隐藏DLL中,导出函数的名称?(转) 一.引言 很多时候,我们写了一个Dll,不希望别人通过DLL查看工具,看到我们的导出函数名称.可以通过以下步骤实现: 1. 在def函数中做如下定义: L ...
- eclipse:Tomcat设置jvm,解决java.lang.OutOfMemoryError: Java heap space 堆内存溢出
eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,这和具体程序运行的jvm大小无 ...