Python网络爬虫爬取新浪新闻
程序员文章站
2022-05-02 22:03:17
...
笔者最近由于需要研究互联网新闻,于是基于邱老师的网络爬虫实战,写了一个爬取新浪新闻的爬虫,爬取的信息有:
- 新闻标题
- 来源url
- 发布时间
- 正文
- 编辑者
与邱老师的爬虫相比有以下几点不同:
- 没有爬取新闻评论数目
- 对错误网页进行跳过处理
- 适应当前网页标签
可以通过修改main下的range(a,b)范围来控制爬取新闻的条数。新浪网每页20条新闻,也就是说range(10)可以爬取10 * 20 = 200 条新闻。爬取的信息最后以.xlsx文件形式输出。这是一个简单的框架。笔者已于2019.4.10爬取了9980条新闻数据,耗时二十余分钟,供参考。
import requests
from bs4 import BeautifulSoup
from datetime import datetime
import json
import pandas
news_url = 'https://news.sina.com.cn/c/2019-04-09/doc-ihvhiewr4450873.shtml'
url = 'https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page={}&encode=utf-8&callback=feedCardJsonpCallback&_=1554884499689'
def getSinaNews(news_url):
print(news_url)
result = {}
try:
res = requests.get(news_url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
result['title'] = soup.select('.main-title')[0].text
result['source'] = soup.select('.source')[0].text
result['time'] = datetime.strptime(soup.select('.date')[0].text.strip(), '%Y年%m月%d日 %H:%M')
result['article'] = ' '.join([p.text.strip() for p in soup.select('.article-content-left p')[:-2]])
result['editor'] = soup.select('.show_author')[0].text.lstrip("责任编辑:")
except:
print("ERROR")
return result
def parseListLinks(url):
news_details = []
res = requests.get(url)
jd = json.loads(res.text[26:-14])
for ent in jd['result']['data']:
news_details.append(getSinaNews(ent['url']))
return news_details
if __name__ == '__main__':
news_total = []
for i in range(1,10):
news = parseListLinks(url.format(i))
news_total.extend(news)
print("爬取新闻条数:",len(news_total))
df = pandas.DataFrame(news_total)
df.to_excel('sina_news.xlsx')