文本为学习笔记
python版本:python3
运行环境:win10
IDE:pycharm
爬虫是什么?
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。(来自百度百科)
作为新手的我,猛地一看!好像什么都没看懂。然后研究了一个早上后发现,其实也就是通过代码来获取网上自己需要的信息和资源嘛。
有一点需要说明的就是——前面也说了,我是一名新手,为什么要发博客万一误导别人呢?其实这个是我的期末作业而已,当然我也会尽力去写好,万一真的能帮到人呢?
撸起袖子开始干!
首先说一下大体思路就是获取新浪网的内容,让后就是使用python提取出每一则新闻的标题、发布时间、网址、来源还有作者。
建好项目,打开编辑器(pycharm)直接开工,这就开始遇到很多的问题了。一开始,我以为是用正则表达式去获取新闻标题等内容,后来在网上找了很多的资料后发现很多大牛们都不建议用正则表达式来匹配HTML(我也不会0.0)。然后经过一番波折之后找到了一个好东西——beautifulsoup,然后就开始了安装这个好东西
https://jingyan.baidu.com/article/e75aca851c7e59142edac6c7.html(安装beautifulsoup传送门)
然后再安装一个bs4
https://www.cnblogs.com/lizm166/p/8128613.html(安装bs4传送门)
安装好上面的东西之后,就开始进入正题了!首先还没试过爬虫的我写了一段小代码测试一下看看是否能够爬取到新浪网的新闻(代码如下)
import requests
from bs4 import BeautifulSoup
res = requests.get('http://news.sina.com.cn/china/')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')
for news in soup.select('.news-item'):
if len(news.select('h2')) >0 :
time = news.select('.time')[0].text
h2 = news.select('h2')[0].text
a = news.select('a')[0]['href']
print(time,h2,a)
跑了一遍之后发现没问题(如下图)
然后开始我们真正的大工程了(提取出每一则新闻的标题、发布时间、网址、来源还有作者),其实感觉上面那个就已经差不多我需要爬取的内容都基本有了,就是还没有新闻来源和新闻作者。那么我们就开始完善它!
要获得新闻的来源和新闻作者就要进入到每一则新闻的链接里面才有,不想上面获取到的内容都是在同一个网页就能获取到,话不多说,直接上代码:
import requests
import json
import pandas
from datetime import datetime
from bs4 import BeautifulSoup
def getNewsDetail(newsurl):
result = {}
result['编辑'] = newsurl
res = requests.get(newsurl)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')
result['时间'] = soup.select('.date')[0].contents[0] #获取时间并且规范时间格式
result['标题'] = soup.select('.main-title')[0].text #获取标题
result['来源'] = soup.select('.source')[0].text #获取来源
result['编辑'] = soup.select('.show_author')[0].text.lstrip('责任编辑:')
print(result['标题'],'\t',result['时间'],'\t',result['来源'],'\t',result['编辑'],'\t','[',newsurl,']')
return result
def parseListLinks(url): #建立剖析清单链接函式
newsdetails = []
res = requests.get(url)
jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');')) #剔除掉无关的代码
for ent in jd['result']['data']:
newsdetails.append(getNewsDetail(ent['url']))
return newsdetails
#抓取每页新闻的内文
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&_=1528651929350'
news_total = []
for i in range(1,2):
newsurl = url.format(i)
newsary = parseListLinks(newsurl)
news_total.extend(newsary)
上面的就是我写完的代码了,运行一遍后就可以发现新闻来源和新闻作者都有了
这个代码里面其实和第一个小测试的时候多了一个新的地方就是json,json可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。至于详细的介绍内容:
https://baike.baidu.com/item/JSON/2462549?fr=aladdin(json百度传送门)
那么到这里为止,爬取新浪网新闻的任务也就完成了!