爬虫实战操作(3)—— 获取列表下的新闻、诗词

本文前两部分想实现:给定链接,获取分页的新闻标题内容,部分程序参考爬虫实战操作(2)一新浪新闻内容细节,爬虫的链接是国际新浪网。

1. 单个新闻

获取国际新闻最新消息下得单个信息内容
根据上面得链接简单修改了下程序参数,主要是评论数得修改。

#给一个新闻id,返回一个信息评论数,因为评论数的网址只差一个新闻id不一样
import re
import requests
import json
commentURL = "https://comment.sina.com.cn/page/info?version=1&format=json\
&channel=gj&newsid=comos-i{}&group=0&compress=0&ie=utf-8&oe=utf-8&page=1\
&page_size=3&t_size=3&h_size=3&thread=1&uid=unlogin_user&callback=jsonp_1601956837238&_=1601956837238"
def getCommentCounts(newsurl):  
    m = re.search('doc-ii(.+).shtml', newsurl)
    newsid = m.group(1) #获取新闻编码id 
    comments=requests.get(commentURL.format(newsid))
    jd=json.loads(comments.text.strip('jsonp_1601956837238').strip('()'))
    
    return jd["result"]["count"]["total"]#获取评论数
import requests
from datetime import datetime
from bs4 import BeautifulSoup
#输入:网址;输出:新闻正文,标题,评论数,来源
def getNewsDetail(newsurl):
    result = {}
    res = requests.get(newsurl)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    result['title'] = soup.select(".main-title")[0].text
    result['newssource'] = soup.select(".source")[0].text
    timesource =soup.select(".date")[0].text
    result['dt'] = datetime.strptime(timesource, "%Y年%m月%d日 %H:%M")
    result['article'] = '\n'.join([p.text.strip() for p in soup.select("#article p")[:-1]])
    result['editor'] = soup.select("#article p")[-1].text.strip('责任编辑:')
    result['comments'] = getCommentCounts(newsurl)
    return result
import json 
news="https://news.sina.com.cn/w/2020-10-06/doc-iivhvpwz0572161.shtml"
getNewsDetail(news)

2. 列表新闻

思想:
先找到控制网页分页的url,如下面的图示
再获取每一页的所有新闻的链接
接着获取每个链接的内容
最后修改分页url的页码

#获取每一页的链接,在调用上面的函数获取每个链接的内容
def parselistlink(url):
    newsdetails=[]
    res=requests.get(url)
    #去除两边的字符串,使得可以用json解析
    jd=json.loads(res.text.lstrip('newsloadercallback(').rstrip(');'))
    for ent in jd['result']['data']:
        #将每页下每个新闻的链接传给getNewsDetail,获取每个新闻的内容
        newsdetails.append(getNewsDetail(ent['url']))
    return newsdetails

url='https://interface.sina.cn/news/get_news_by_channel_new_v2018.d.html?cat_1=51923&show_num=27&level=1,2&page={}&callback=newsloadercallback&_=1601968313565'
result=pd.DataFrame() 
import pandas as pd
#获取前5页的内容
for i  in range(1,5):
    newsurl=url.format(i)
    newsary=parselistlink(newsurl)
    result=pd.concat([result,pd.DataFrame(newsary)],axis=0)
print(result)
result1=result.drop_duplicates(keep='first')
result1=result1.reset_index().drop('index',axis=1)
print(result1)

3. 列表诗词

诗词链接:https://www.shicimingju.com/chaxun/zuozhe/9_2.html

1.先获取每一页的诗词的链接

url='http://www.shicimingju.com/chaxun/zuozhe/9.html'
base='https://www.shicimingju.com'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
        (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
#使用headers(客户端的一些信息),伪装为人类用户,使得服务器不会简单地识别出是爬虫
r=requests.get(url,headers=headers)
html=r.text.encode(r.encoding).decode()
soup=BeautifulSoup(html,'lxml')
div=soup.find('div',attrs={'class':'card shici_card'})
hrefs=[h3.find('a')['href'] for h3 in div.findAll('h3')]
hrefs=[base+i for i in hrefs]
hrefs

2.再获取所有页码下的所有诗词的链接

def gethrefs(url):
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
            (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
    #使用headers(客户端的一些信息),伪装为人类用户,使得服务器不会简单地识别出是爬虫
    base='https://www.shicimingju.com'
    nexturl=url
    ans=[]
    while nexturl!=0:
        r=requests.get(nexturl,headers=headers)
        html=r.text.encode(r.encoding).decode()
        soup=BeautifulSoup(html,'lxml')
        div=soup.find('div',attrs={'class':'card shici_card'})
        hrefs=[h3.find('a')['href'] for h3 in div.findAll('h3')]
        hrefs=[base+i for i in hrefs]
        try:
            nexturl=base+soup.find('a',text='下一页')['href']
            print('读取页码中')
        except Exception as e:
            print('已经是最后一页')
            nexturl=0
        ans.append(hrefs)
    return ans

3.获取每个连接下的古诗内容

def writeotxt(url):
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
            (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
    #使用headers(客户端的一些信息),伪装为人类用户,使得服务器不会简单地识别出是爬虫
    r=requests.get(url,headers=headers)
    soup=BeautifulSoup(r.text.encode(r.encoding),'lxml')
    #数据清洗
    titile=soup.find('h1',id='zs_title').text
    content=soup.find('div',class_='item_content').text.strip()
    #先建一个文件夹
    firedir=os.getcwd()+'苏轼的词'
    if not os.path.exists(firedir):
        os.mkdir(firedir)
    with open (firedir+'/%s.txt'%title,mode='w+',encoding='utf-8') as f:
        f.write(title+'\n')
        f.write(content+'\n')
        print('正在载入第 %d首古诗。。。'%i)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值