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/
赞赏
微信赞赏支付宝赞赏
发表评论