python+BeautifulSoup爬取网易新闻到txt文件

python支持跨平台运行,但是python2.x与python3.x的源码不一定通用, python3自带的2to3功能可以将2.x的源码转换成3.x的源码,可以在网上搜下教程获取我这篇文章里看下:Python3.7使用钉钉2.x版本接口(取token发钉钉消息)

本文python代码基于python3.7版本制作。使用BeautifulSoup库操作python爬取到的页面内容还是很方便的。这里直接以网易新闻科技板块第二页做示例:url = 'http://tech.163.com/special/gd2016_02/'

python3.7爬取网易新闻完整源码

import requests
from bs4 import BeautifulSoup

#在python中函数的定义一定要早于调用。定义一个根据url获取页面内容的函数
def get_detials(link):
    #print(link)
    all_text = requests.get(link).text
    soup = BeautifulSoup(all_text,'lxml')
    #在浏览器F12的视图下,查看网易新闻主题位于class='post_text'的div下
    #beautifulsoup的selecct筛选返回的是list串,soup.select("div>div[class='post_text']")[0]指取第一个串值
    content = soup.select("div>div[class='post_text']")[0].get_text()   
    print(content)
    return content


#url = 'https://www.163.com'
url = 'http://tech.163.com/special/gd2016_02/'
#不管用python爬取什么网页,先把url网址打开,按F12开启浏览器调试模式,根据目标页面的元素布局来匹配过滤条件
wbdata = requests.get(url).text

#使用BeautifulSoup对request获取到的页面文本内容进行解析
soup = BeautifulSoup(wbdata,'lxml')

#在soup结果中使用beautifulsoup的select筛选器进行内容筛选获得文章标题。
#select筛选器介绍文末介绍,查找页面标签层级位于"li>div>h3>a"结构下的文本信息,返回list串
news_titles = soup.select("li>div>h3>a")
#print(news_titles)
#获得url页面文章的新闻标题list

news_num = soup.select("li>div>p>a")
#获得url页面文章的评论数list, 因为"li>div>p>a"这种结构能唯一定位到每个文章对应的评论数

#news_time = soup.select('li>div>p>span')
#news_time = soup.select('li>div>p[class="sourceDate"]')
news_time = soup.select("li>div>p[class='sourceDate']")
#获得每篇文章的来源以及投递时间list。 这里的select筛选器使用了组合模式,限定了p标签的class=sourceDate的内容才保留
#

#如果news_title bews_num news_time的筛选结果数量不一致可能是你的select筛选条件没限定好!

i = 0 #在下面的for循环中定位list串的偏移值,list串从0开始
for n in news_titles:#循环新闻标题list,获得每个元素的内容n
    #print(n)
    # n的字符串内容形如: <a href="https://tech.163.com/20/0327/10/F8NGD2UA00097U7R.html">美国科技五巨头强势,美股大跌期间也比大盘跌得</a>
    title = n.get_text() #get_text()获取n字符串标签内部的文本“美国科技五巨头强势,美股大跌期间也比大盘跌得”
    # 
    link = n.get("href") #get("href") 获取n字符串属性为href的值“https://tech.163.com/20/0327/10/F8NGD2UA00097U7R.html”
    
    num = news_num[i].get_text()
    #获取news_num list串的第i个字符串对应标签内的文本。 news_titles news_num news_times 串是一一对应的(如果前面select筛选正确的话)
    time = news_time[i].get_text()
    data = {
    '来源':time,
    '标题':title,
    '链接':link,
    '评论':num
    }
    i=i+1;
    #print('<beg===============================================beg>')
    #print(data)
    #get_detials(link)
    #print('<end===============================================end>')

    #每次根据新闻列表的url访问新闻详情 并追加写入txt文件
    with open('a.txt','ab')as f: #'w'表示写数据,写之前会清空文件中的原有数据! 'a'表示追加写入不会清除之前的文件
    #'b'表时读写的编码方式位bit位。  如果没有b参数就是str字符串方式
     text = str(data) +"\n"+ get_detials(link)
     text += "\n<end===============================================end>\n\n\n\n"
     f.write(text.encode()) #因为使用open('a.txt','ab') 这里需要encode一下;如果读写文件的参数没有'b'这里则只需写f.write(text)
     f.close()

在测试过程中发现如果新闻内嵌有视频,会导致输出其他多余字符串。

BeautifulSoup中select筛选器

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/python-beautifulsoup-netease/

赞赏

微信赞赏支付宝赞赏

发表评论