爬取网页的标题、时间、来源 、正文、作者、评论数、新闻id
程序员文章站
2022-01-28 21:53:41
...
# coding: utf-8
# In[4]:
#导入包
import requests
from bs4 import BeautifulSoup
#爬取特定网页
res = requests.get("https://news.sina.com.cn/china/")
#转化文字编码
res.encoding = 'utf-8'
#存进BeautifulSoup元素中
soup = BeautifulSoup(res.text, 'html.parser')
#print(soup)
for news in soup.select('.news-1'):#爬取并遍历所有class为"news_1”的元素
li = news.select('li')#选取所有含有'li'特定标签的元素,并存进li这个list中去
num = len(li)#获取到元素的个数
if num > 0:
for i in range(0, num):
print(li[i].text)
#a = '<a href = "#" abc = 456 def = 123> i am a link </a>'
#soup = BeautifulSoup(a, 'html.parser')
#print(soup.select('a')[0]['href'])#输出"#"
#print(soup.select('a')[0]['abc'])#输出"456"
#print(soup.select('a')[0]['def'])#输出"123"
#soup.select('#main-title')[0].text
# In[5]:
soup.select("#_blank")[0].text
# In[6]:
#导入包
import requests
from bs4 import BeautifulSoup
#爬取特定网页
res = requests.get("http://news.sina.com.cn./c/nd/2016-08-20/doc-ifxvctcc8121090.shtml")
#转化文字编码
res.encoding = 'utf-8'
#存进BeautifulSoup元素中
soup = BeautifulSoup(res.text, 'html.parser')
#print(soup)
#for big in soup.select('.right_content"):
#for news_1 in soup.select('.news-1'):#爬取并遍历所有class为"news_1”的元素,抓取类的时候,要加上'.'
# li = news_1.select('li')#选取所有含有'li'特定标签的元素,并存进li这个list中去
# a = news_1.select('a')#选取所有含有'a'标签的元素
# num = len(li)#获取到元素的个数
#if num > 0:
# for i in range(0, num):
# print(li[i].text,a[i]['href'])
#print(soup)
#for news_2 in soup.select(".news-2"):
# li
#a = '<a href = "#" abc = 456 def = 123> i am a link </a>'
#soup = BeautifulSoup(a, 'html.parser')
#print(soup.select('a')[0]['href'])#输出"#"
#print(soup.select('a')[0]['abc'])#输出"456"
#print(soup.select('a')[0]['def'])#输出"123"
# In[5]:
soup.select('#artibodyTitle')[0].text #选取id为artibodyTitle的标签,前面要加'#' 输出文字内容
# In[5]:
soup.select('.time-source')[0] #选取class为time-source的标签,也可以用id来选取:select('#navtimeSource')
# In[6]:
soup.select('.time-source')[0].text #选取class为time-source的标签,也可以用id来选取:select('#navtimeSource') 输出文字内容
# In[14]:
soup.select('.time-source')[0].contents #选取class为time-source的标签,也可以用id来选取:select('#navtimeSource') 选取所包含的所有标签
# In[15]:
soup.select('.time-source')[0].contents[0] #选取class为time-source的标签,也可以用id来选取:select('#navtimeSource') 选取所包含内容的第一个标签
# In[21]:
timesource = soup.select('.time-source')[0].contents[0].strip() #选取class为time-source的标签,也可以用id来选取:select('#navtimeSource') 选取所包含内容的第一个标签,并忽略多余的换行
type(timesource) #此时得到的时间是字符类型
# In[27]:
from datetime import datetime #导入包
dt = datetime.strptime(timesource,'%Y年%m月%d日%H:%M') #将字符类型转为时间类型
print(dt)
# In[29]:
dt.strftime('%d-%Y-%M') #将时间类型的dt转为任意自定义格式
# In[30]:
soup.select('.time-source')[0] #选取class为time-source的标签,也可以用id来选取:select('#navtimeSource')
# In[33]:
soup.select('.time-source span')[0] #选取class为time-source的标签span下的span标签
# In[34]:
soup.select('.time-source span a')[0] #选取class为time-source的标签span下的span下的a标签
# In[35]:
soup.select('.time-source span a')[0].text #选取class为time-source的标签span下的span下的a标签
# In[13]:
soup.select('#artibody') #选取id为artibody的标签
#soup.select('.article article_16') #选取id为artibody的标签 这种方法不行。。我也不知道为什么。。。
# In[14]:
soup.select('#artibody p') #选取id为artibody的标签中的p标签
# In[16]:
soup.select('#artibody p')[:-1] #选取id为artibody的标签的p标签 并去除最后一个p标签
# In[17]:
article = [] #用于存放文章内容
for p in soup.select('#artibody p')[:-1]:
article.append(p.text) #将每一个p标签内的内容存入article中去
print(article)
# In[18]:
article = [] #这个列表用于存放各个p标签内的文字
for p in soup.select('#artibody p')[:-1]:
article.append(p.text.strip()) #将每一个p标签内的文字(去除换行等字符)存入article中去
print(article)
# In[22]:
article = [] #这个列表用于存放各个p标签内的文字
for p in soup.select('#artibody p')[:-1]:
article.append(p.text.strip()) #将每一个p标签内的文字(去除换行等字符)存入article中去
print(article)
#' '.join(article) #将列表中的各个元素合并,以' '作为分隔
'@@@@@'.join(article) #将列表中的各个元素合并,以'@'作为分隔
# In[23]:
#以上块可以用一行代码实现
'@@@@'.join([p.text.strip() for p in soup.select('#artibody p')[:-1]])
# In[24]:
soup.select('.article-editor') #选取class为article-editor的标签
# In[26]:
soup.select('.article-editor')[0].text #选取class为article-editor的标签,并输出标签文字
# In[27]:
soup.select('.article-editor')[0].text.strip("责任编辑:") #选取class为article-editor的标签,并输出标签文字, 并移除”责任编辑:“文字
# In[8]:
soup.select('#commentCount1')
# In[19]:
comment = requests.get('http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-fxvctcc8121090&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20') #这个网址是包含评论的网址 得在network下寻找对应的相应包
import json
jd = json.loads(comment.text.strip('var data=')) #通过json模块下的函数 将网页读进成一个字典, 并用strip()去除js的格式“var data="
# In[21]:
jd['result']['count']['total'] #取出字典中的total值
# In[22]:
newsrul = 'http://news.sina.com.cn./c/nd/2016-08-20/doc-ifxvctcc8121090.shtml'
newsrul.split('/') #根据'/'进行切割,切割好的内容放入字典中
# In[23]:
newsrul.split('/')[-1] #根据'/'进行切割,切割好的内容放入字典中, 并取出字典中的最后一个元素
# In[24]:
newsrul.split('/')[-1].rstrip('shtml') #根据'/'进行切割,切割好的内容放入字典中, 并取出字典中的最后一个元素, 去除'shtml',其中rstrip中的r表示从右开始移除
# In[28]:
newsid = newsrul.split('/')[-1].rstrip('.shtml').lstrip('doc-') #......去除'shtml',其中rstrip中的r表示从右开始移除,从左移除’doc-'
newsid
# In[37]:
#以上取得newsid的操作也可以通过正则表达式实现
import re
m = re.search('doc-i(.+).shtml',newsrul) #第一个参数是要寻找的内容的格式 第二个参数是所寻找的目的源
m
# In[38]:
m.group(0)
# In[41]:
newsid = m.group(1)
newsid
上一篇: listview数据显示逐次渐现动画效果
下一篇: 爬取大众点评网的酒店信息