爬取新闻标题和内容——python爬虫

1,399 阅读3分钟

这是一篇关于如何使用python爬取网易新闻标题和内容的文章。

首先来看一下我们需要调用的库

import requests
from bs4 import BeautifulSoup
from lxml import etree
import pandas as pd

由于我们要存储的是标题内容时间一系列的信息,我们选择建立一个字典类型的对象用于存储这些信息

result={
    '新闻标题':[],
    '发布时间':[],
    '发布内容':[]
}#建立一个字典类型

打开网易新闻的首页图示位置就是我们需要的内容

接着我们打开开发者工具

我们发现a标签里的就是网站的详情地址因此我们要想办法把a标签里的网站详情地址取出

url='https://news.163.com/'
page_text=requests.get(url=url,headers=headers).content
#需要在首页中解析----实例化
soup=BeautifulSoup(page_text,'lxml')
li_list=soup.select('.hidden > div')
#寻找网页的详细地址url
for li in li_list:
        detail_url = li.a['href']#将网页的详细地址一一取出

这里我们使用的是beautifulsoup的方法将网易新闻中的a标签取出,接着我们需要做的就是对着取出的详情网站进行解析。

我们对网页的分析可以知道网易新闻中独家一栏的网站布局和其他的栏目是不同的。

因此我们需要做的就是流程的控制对独家栏目的文章进行单独的访问

if 'data' in detail_url:#独家栏目中的的页面布局不同
detal_page_data_text = requests.get(url=detail_url, headers=headers).text

接下来就是具体的将网站的信息解析出来了首先我们随意点开一个文章的详情页。

打开开发者工具

 定位到了标题的位置我们的任务就是获取这个标题的文本信息。

detal_page_text = requests.get(url=detail_url, headers=headers).text#对网站的详情地址进行访问
tree = etree.HTML(detal_page_text)
title = tree.xpath('//div[@class="post_main"]/h1[@class="post_title"]/text()')#通过xpath进行访问
if len(title) > 0:#防止出现错误
    title = title[0]
    result['新闻标题'].append(title)

其他的内容获取是一样的,这里就不进行解释了。最后附上源码

import requests
from bs4 import BeautifulSoup
from lxml import etree
import pandas as pd
result={
    '新闻标题':[],
    '发布时间':[],
    '发布内容':[]
}#建立一个字典类型
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
}
url='https://news.163.com/'
page_text=requests.get(url=url,headers=headers).content
#需要在首页中解析----实例化
soup=BeautifulSoup(page_text,'lxml')
li_list=soup.select('.hidden > div')
#寻找网页的详细地址url
for li in li_list:
        detail_url = li.a['href']#将网页的详细地址一一取出
        if 'data' in detail_url:#独家栏目中的的页面布局不同
            detal_page_data_text = requests.get(url=detail_url, headers=headers).text
            tree2=etree.HTML(detal_page_data_text)
            title2 = tree2.xpath('//div[@class="main-a clearfix"]/div[@class="left"]/h1/text()')[0]
            result['新闻标题'].append(title2)
            time2 = tree2.xpath('//div[@class="main-a clearfix"]/div[@class="left"]/div[@class="main-info"]/p[1]/text()')[0]
            result['发布时间'].append(time2)
            content2 =tree2.xpath('//div[@class="main-content"]/div/p/text()')
            content2_detail = " ".join(content2)
            result['发布内容'].append(content2_detail)

        else:
            detal_page_text = requests.get(url=detail_url, headers=headers).text#对网站的详情地址进行访问
            tree = etree.HTML(detal_page_text)
            title = tree.xpath('//div[@class="post_main"]/h1[@class="post_title"]/text()')#通过xpath进行访问
            if len(title) > 0:#防止出现错误
                title = title[0]
                result['新闻标题'].append(title)
            time = tree.xpath('//div[@class="post_main"]/div[@class="post_info"]/text()')
            if len(time) > 0:
                time = time[0].strip()
                time_need = time[0:19]#仅取出那些我们需要的时间
                result['发布时间'].append(time_need)
            detail_content = tree.xpath('//div[@class="post_main"]/div[@class="post_content"]/div[@class="post_body"]/p/text()')
            content = " ".join(detail_content)#将那些列表中的正文内容取出
            result['发布内容'].append(content)
            print(title)
df =pd.DataFrame.from_dict(result, orient='index')
df.to_csv("news.csv", encoding="utf_8_sig")  # 进行持久化存储
print('存储成功')