Python_网络爬虫(新浪新闻抓取)

爬取前的准备:

  • BeautifulSoup的导入:pip install BeautifulSoup4
  • requests的导入:pip install requests
  • 下载jupyter notebook:pip install jupyter notebook
  • 下载python,配置环境(可使用anocanda,里面提供了很多python模块)

json

  • 定义 :是一种格式,用于数据交换。

Javascript 对象

  • 定义 : 一种javascript的引用类型

中文格式除了‘ utf-8 ’还有‘ GBK ’、‘ GB2312 ’ 、‘ ISO-8859-1 ’、‘ GBK ‘’等

用requests可获取网页信息

用BeautifulSoup可以将网页信息转换为可操作物块

1 soup = BeautifulSoup(res.text,‘html.parser‘)
2 # 将requests获取的网页信息转换为BeautifulSoup的物件存于soup中,并指明其剖析器为‘html.parser‘,否则会出现警告。

用beautifulSoup中的select方法可以获取相应的元素,且获取的元素为list形式,可以用for循环将其逐个解析出来

1 alink = soup.select(‘h1‘)
2
3 for link in alink:
4     print(link.text)

获取html标签值后,可以用[‘href’]获取‘href’属性的值,如

1 for link in soup.select(‘a‘):
2    print(link[‘href‘])

获取新闻编号:

* .strip()可以去除前后空白格,括号内加入字符串可以去除指定字符串,rstrip()可以去除右边的,lstrip()可以去除左边的;

*  split(‘/‘)根据指定的字符对字符串进行切割

re正则表达式的使用:

1 import re
2
3 m = re.search(‘ doc-i(.*).shtml ‘,newsurl)  # 返回在newsurl中匹配到的字符串
4 print(m.group(1))  # group(0)可以取得所有匹配到的部分,group(1)只可以取得括号内的部分

使用for循环获取新闻的多页链接

1 url = ‘http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1501000415111‘
2
3 for i in rannge(0,10):
4   print( url.format( i ) )
5 # format可以将url里面的大括号(要修改的部分我们把它删去并换成大括号)换为我们要加入的值(如上面代码中的 i)

获取新闻发布的时间:

  获取的信息可能会有包含的成分,即会获取到如出版社的其他我们不需要的元素,可以用contents将里面的元素分离成list形式,用contents[0]即可获取相应元素

1 # 获取出版时间
2 from datetime import datetime
3
4 res = requests.get(‘http://news.sina.com.cn/c/nd/2017-07-22/doc-ifyihrmf3191202.shtml‘)
5 res.encoding = ‘utf-8‘
6 soup = BeautifulSoup(res.text,‘html.parser‘)
7 timesource = soup.select(‘.time-source‘)
8 print(timesource[0].contents[0]) 

  时间字符串转换 

1 # 字符串转时间:-strptime
2 dt = datetime.strptime(timesource,‘%Y年%m月%d日%H:%M ’)
3
4 # 时间转换字符串:-strftime
5 dt.strftime(‘%Y-%m-%d‘)

获取新闻内文:

  检查其所属类后按照上面的 select 获取新闻内文,获取的内容为list形式,可用for循环将内容去除标签后加入到自己创建的的list中(如article = [])

  * 其中可以用 ‘ \n ’.join( article ) 将article列表中的每一项用换行符‘ \n ’分隔开;

1 # 获取单篇新闻内容
2 article = []
3 for p in soup.select(‘.article p‘):
4     article.append(p.text.strip())
5 print(‘\n‘.join(article))

  上面获取单篇新闻的代码可用一行完成:

1 # 一行完成上面获取新闻内容的代码
2 print(‘\n‘.join([p.text.strip() for p in soup.select(‘.article p‘)]))

获取评论数量:(在获取评论数量时会发现评论是用js的形式发送给浏览器的,所以要先把获取的内容转化为json格式读取python字典

1 # 取得评论数的数量
2 import requests
3 import json
4 comment = requests.get(‘http://comment5.news.sina.com.cn/page/info?version=1&format=js&c5 hannel=gn&newsid=comos-fyihrmf3218511&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20‘)  # 从评论地址获取相关内容
6 comment.encoding = ‘utf-8‘
7 jd = json.loads(comment.text.strip(‘var data=‘))
8 jd[‘result‘][‘count‘][‘total‘]

完整代码(以获取新浪新闻为例)

 1 # 获取新闻的标题,内容,时间和评论数
 2 import requests
 3 from bs4 import BeautifulSoup
 4 from datetime import datetime
 5 import re
 6 import json
 7 import pandas
 8
 9 def getNewsdetial(newsurl):
10     res = requests.get(newsurl)
11     res.encoding = ‘utf-8‘
12     soup = BeautifulSoup(res.text,‘html.parser‘)
13     newsTitle = soup.select(‘.page-header h1‘)[0].text.strip()
14     nt = datetime.strptime(soup.select(‘.time-source‘)[0].contents[0].strip(),‘%Y年%m月%d日%H:%M‘)
15     newsTime = datetime.strftime(nt,‘%Y-%m-%d %H:%M‘)
16     newsArticle = getnewsArticle(soup.select(‘.article p‘))
17     newsAuthor = newsArticle[-1]
18     return newsTitle,newsTime,newsArticle,newsAuthor
19 def getnewsArticle(news):
20     newsArticle = []
21     for p in news:
22          newsArticle.append(p.text.strip())
23     return newsArticle
24
25 # 获取评论数量
26
27 def getCommentCount(newsurl):
28     m = re.search(‘doc-i(.+).shtml‘,newsurl)
29     newsid = m.group(1)
30     commenturl = ‘http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20‘
31     comment = requests.get(commenturl.format(newsid))   #将要修改的地方换成大括号,并用format将newsid放入大括号的位置
32     jd = json.loads(comment.text.lstrip(‘var data=‘))
33     return jd[‘result‘][‘count‘][‘total‘]
34
35
36 def getNewsLinkUrl():
37 #     得到异步载入的新闻地址(即获得所有分页新闻地址)
38     urlFormat = ‘http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1501000415111‘
39     url = []
40     for i in range(1,10):
41         res = requests.get(urlFormat.format(i))
42         jd = json.loads(res.text.lstrip(‘  newsloadercallback(‘).rstrip(‘);‘))
43         url.extend(getUrl(jd))     #entend和append的区别
44     return url
45
46 def getUrl(jd):
47 #     获取每一分页的新闻地址
48     url = []
49     for i in jd[‘result‘][‘data‘]:
50         url.append(i[‘url‘])
51     return url
52
53 # 取得新闻时间,编辑,内容,标题,评论数量并整合在total_2中
54 def getNewsDetial():
55     title_all = []
56     author_all = []
57     commentCount_all = []
58     article_all = []
59     time_all = []
60     url_all = getNewsLinkUrl()
61     for url in url_all:
62         title_all.append(getNewsdetial(url)[0])
63         time_all.append(getNewsdetial(url)[1])
64         article_all.append(getNewsdetial(url)[2])
65         author_all.append(getNewsdetial(url)[3])
66         commentCount_all.append(getCommentCount(url))
67     total_2 = {‘a_title‘:title_all,‘b_article‘:article_all,‘c_commentCount‘:commentCount_all,‘d_time‘:time_all,‘e_editor‘:author_all}
68     return total_2
69
70 # ( 运行起始点 )用pandas模块处理数据并转化为excel文档
71
72 df = pandas.DataFrame(getNewsDetial())
73 df.to_excel(‘news2.xlsx‘)

存储的excel文档如下:

TIPS:

问题:在jupyter notebook导入pandas时可能会出现导入错误

解决:不要用命令行打开jupyter notebook,直接找到软件打开或者在Anocanda Navigator中打开

2017-07-29  21:49:37

时间: 2024-10-26 17:00:26

Python_网络爬虫(新浪新闻抓取)的相关文章

iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教程,于是待问题解决后抽时间截了图,自己写一遍封存在博客园中以便以后随时查阅. charles又名青花瓷,在iOS开发中的抓包中具有重要作用.最大的三点用处,一就是拦截别人软件的发送的请求和后端接口,练习开发.二是自己后端返回的response拦截修改后再接收以达到测试临界数据的作用.三写脚本重复拦截

网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. 要想得到书籍的详细信息和ISBN码,我们需要遍历所有的页码,进入到书籍列表,然后从书籍列表进入到每本书的详情页里,这样就能够抓取详情信息和ISBN码了. 二.从分页里遍历每一页书籍列表 通过查看分页功能的HTML代码,通过class="current"可以定位当前页码所在span标签,此s

iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看看网络爬虫的基本原理: 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.

网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码) 接下来将通过ISBN码去amazon.com获取每本书对应的价格. 一.了解需要和分析网站 通过分析amazon.com得知,以ISBN码作为搜索关键字可查找到对应的书. 结果页码就有这本书的价格,既然价格是以$符号开头,那就可以通过正则表达式得到价格. 通过正则表达式匹配价格代码:

java网络爬虫实现信息的抓取

转载请注明出处:http://blog.csdn.NET/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点时间写了个demo供演示使用. 思想很简单:就是通过Java访问的链接,然后拿到html字符串,然后就是解析链接等需要的数据. 技术上使用Jsoup方便页面的解析,当然Jsoup很方便,也很简单,一行代码就能知道怎么用了: [java] Document doc = Jsoup.connect("h

python网络爬虫 新浪博客篇

上次写了一个爬世纪佳缘的爬虫之后,今天再接再厉又写了一个新浪博客的爬虫.写完之后,我想了一会儿,要不要在博客园里面写个帖子记录一下,因为我觉得这份代码的含金量确实太低,有点炒冷饭的嫌疑,就是把上次的代码精简了一下,用在另外一个网站而已,而且爬别人的博客总有一种做贼心虚的感觉,怕被各位园友认为是偷窥狂魔.但是这份代码总归是我花了精力去写的,我也不想就此让它深藏在硬盘之中(电脑实在太老了,可能过两年硬盘坏了,这份代码就消失了),还是贴出来权当作抛砖引玉. 说起要爬新浪博客,总归是有一个原因吧.我的原

网络爬虫: 从allitebooks.com抓取书籍信息: 抓取allitebooks.com书籍信息及ISBN码 from backslash112

from urllib2 import urlopen from bs4 import BeautifulSoup # Get the next page url from the current page url def get_next_page_url(url): page = urlopen(url) soup_page = BeautifulSoup(page, 'lxml') page.close() # Get current page and next page tag curr

Python爬虫:新浪新闻详情页的数据抓取(函数版)

上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数,方便直接调用. 详情页抓取的6个数据:新闻标题.评论数.时间.来源.正文.责任编辑. 首先,我们先将评论数整理成函数形式表示: 1 import requests 2 import json 3 import re 4 5 comments_url = 'http://comment5.news.sina.c

python爬虫:抓取新浪新闻内容(从当前时间到之前某个时间段),并用jieba分词,用于训练自己的分词模型

新浪新闻内容采用的是ajax动态显示内容,通过抓包,发现如下规律: 每次请求下一页,js那一栏都会出现新的url: "http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1" "||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&ta