欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬取网页的标题、时间、来源 、正文、作者、评论数、新闻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

 

相关标签: 爬虫