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 requestsfrom bs4 import BeautifulSoup#在python中函数的定义一定要早于调用。定义一个根据url获取页面内容的函数def get_detials(link):#print(link)all_text = requests.get(link).textsoup = 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页面文章的新闻标题listnews_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()

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