python 开心网和豆瓣日记爬取的小爬虫

Python 开心网和豆瓣日记爬取的小爬虫是一个比较简单的网页抓取程序,用于获取指定网站的日记文章,并将其存储到本地文件中。本文将阐述该小爬虫的完整攻略,包括实现的步骤和示例说明。

环境准备

在实现该小爬虫之前,需要先安装 Python 3.xrequests 库以及 BeautifulSoup 库。其中,requests 库和 BeautifulSoup 库用于发送 HTTP 请求和解析 HTML 页面中的内容。在安装完成后,可以在命令行中测试以下命令,确保已经成功安装:

python --version
pip install requests
pip install beautifulsoup4

实现步骤

  1. 了解目标网站的 URL 结构

在开始实现之前,需要先了解目标网站的 URL 结构。以开心网日记为例,其日记文章的 URL 类似于 http://www.kaixin001.com/!home/blog/get_articles.php?page=1&uid=123456,其中 &page=1 代表文章列表的页码,而 &uid=123456 则代表作者的唯一 ID。在实现时,需要将 page 参数的值进行循环遍历,以获取所有文章列表页。

  1. 发送 HTTP 请求获取文章列表

在了解了 URL 结构之后,可以使用 requests 库发送 HTTP GET 请求,获取文章列表的 HTML 页面。示例代码如下:

import requests

url = 'http://www.kaixin001.com/!home/blog/get_articles.php?page=1&uid=123456'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
response = requests.get(url, headers=headers)

需要注意的是,为了避免被目标网站识别出为爬虫程序,需要设置正确的 User-Agent,以模拟正常用户的浏览行为。可以在浏览器中打开目标网页,在开发者模式下查看 Network 列表,找到合适的 User-Agent 进行设置。

  1. 解析 HTML 页面中的文章列表

使用 BeautifulSoup 库可以方便地解析 HTML 页面中的内容。在这里,需要使用该库解析出 HTML 页面中具体文章的标题、作者、发表时间、以及文章详情页的 URL。示例代码如下:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')
articles = soup.find_all('div', class_='article_title')

for article in articles:
    title = article.find('a').text
    url = article.find('a').get('href')
    author = article.find_next_sibling('div', class_='article_title_author').find('a').text
    create_time = article.find_next_sibling('div', class_='article_title_author').find('span').text

    # 下一步:使用文章详情页的 URL 发送新的 HTTP 请求获取文章内容
    # ...
  1. 发送 HTTP 请求获取文章详情

根据上一步获取到的文章详情页 URL,可以使用 requests 库再次发送 HTTP GET 请求,获取具体文章的内容。示例代码如下:

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
content = soup.find('div', class_='article_body').text

其中,article_body 是文章详情页 HTML 页面中文章内容所在的 div 元素的 class 名称,可以通过浏览器中的开发者模式查看相应文本内容对应的元素。

  1. 存储文章内容到本地文件

最后,可以将获取到的文章内容存储到本地文件中。以 .txt 文件为例,可以使用 Python 的文件操作模块 osio,创建一个新文件并写入文章内容。示例代码如下:

import os
import io

filename = title + '.txt'
filepath = os.path.join('.', 'articles', filename)
with io.open(filepath, 'w', encoding='utf-8') as file:
    file.write(content)

其中,filename 是文章标题加 .txt 后缀生成的文件名,filepath 则为该文件的完整路径,其中 articles 为存放文章文件的文件夹名称。可以通过当前工作目录中存在该文件夹进行存储,使用 os.path.join() 来生成完整的路径名。

示例说明

以豆瓣日记爬取为例,完整代码如下:

import os
import io
import requests
from bs4 import BeautifulSoup

# 目标作者的豆瓣 ID
douban_user_id = 123456

# 发送 HTTP 请求获取文章列表
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
url = f'https://www.douban.com/people/{douban_user_id}/notes'
response = requests.get(url, headers=headers)

# 解析 HTML 页面中的文章列表
soup = BeautifulSoup(response.text, 'html.parser')
articles = soup.find_all('div', class_='title')

for article in articles:
    title = article.find('a').text
    url = article.find('a').get('href')

    # 发送 HTTP 请求获取文章详情
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    content = soup.find('div', class_='note')

    # 存储文章内容到本地文件
    filename = title + '.txt'
    filepath = os.path.join('.', 'articles', filename)
    with io.open(filepath, 'w', encoding='utf-8') as file:
        file.write(str(content))

在该示例中,直接将豆瓣日记爬取的 URL 拼接完成,获取文章列表中的文章标题和详情页 URL,并保存到本地文件夹 articles 中。需要注意的是,在获取文章详情时,该示例中使用了 str(content) 将整个 HTML 页面内容保存到文件中,可能会带来一些不必要的格式问题。

以开心网日记爬取为例,需要进行多页的文章列表爬取,完整代码如下:

import os
import io
import requests
from bs4 import BeautifulSoup

# 目标作者的开心网唯一 ID
kx_uid = '123456'

# 发送 HTTP 请求获取多页文章列表
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
for page in range(1, 3):
    url = f'http://www.kaixin001.com/!home/blog/get_articles.php?page={page}&uid={kx_uid}'
    response = requests.get(url, headers=headers)

    # 解析 HTML 页面中的文章列表
    soup = BeautifulSoup(response.text, 'html.parser')
    articles = soup.find_all('div', class_='article_title')

    for article in articles:
        title = article.find('a').text
        url = article.find('a').get('href')
        author = article.find_next_sibling('div', class_='article_title_author').find('a').text
        create_time = article.find_next_sibling('div', class_='article_title_author').find('span').text

        # 发送 HTTP 请求获取文章详情
        response = requests.get(url, headers=headers)
        soup = BeautifulSoup(response.text, 'html.parser')
        content = soup.find('div', class_='content')

        # 存储文章内容到本地文件
        filename = title + '.txt'
        filepath = os.path.join('.', 'articles', filename)
        with io.open(filepath, 'w', encoding='utf-8') as file:
            file.write(str(content))

在该示例中,使用了 Python 的 range() 函数对文章列表页面进行循环遍历,以获取多页文章。为了方便测试,该示例中仅获取了前 2 页的文章列表。需要注意的是,在文章详情页中,开心网的文章内容并不会直接显示在页面中,而是在页面中加载 JS 文件异步获取。因此在该示例中,需要在浏览器中手动进入文章页,复制文章内容相关标签,确定正则表达式等内容进行文章内容的爬取。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 开心网和豆瓣日记爬取的小爬虫 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python运行cmd命令行的3种方法总结

    请看下面的攻略: python运行cmd命令行的3种方法总结 在Python中,有时需要通过CMD或终端来执行一些命令行操作,例如生成一个目录,查看网络连接,克隆一个代码库等,这就需要使用到python运行cmd命令行。本篇文章将介绍3种python运行cmd命令行的方法,并提供相应的示例代码。 方法1:使用os.system函数 这是运行命令的最简单方法,…

    python 2023年6月5日
    00
  • 一文详解Python中实现单例模式的几种常见方式

    一文详解Python中实现单例模式的几种常见方式 单例模式是一种常见的设计模式,它的目的是确保一个类只有一个实例,并且提供全局访问点。 在Python中,有许多不同的方法可以实现单例模式。本文将介绍其中的几种常见方式。 方法一:使用模块中的变量 在Python中,模块是一种全局变量,它只会被导入一次。因此,在模块中定义一个全局变量,即可实现单例模式。 # s…

    python 2023年5月19日
    00
  • Python程序退出方式小结

    当Python程序运行完毕或遇到致命错误时,程序将自动退出。但有些情况下,我们需要在程序执行期间主动退出程序,本文将介绍4种主动退出程序的方式。 1. 使用sys.exit() sys.exit() 函数可以强制退出程序。该函数的参数是一个整数或字符串,表示退出程序的状态。如果参数是整数,那么0表示程序正常退出,其他值表示退出时出现错误。 示例代码: imp…

    python 2023年5月13日
    00
  • 关于Python字符串显示u…的解决方式

    关于Python字符串显示u…的问题,其实是与Python的编码方式有关的。在Python 2版本中,默认使用ASCII编码格式,而在Python 3版本中则默认使用Unicode编码格式。因此,在Python 2版本中,如果出现u…的情况,则表示该字符串是Unicode编码格式,需要进行转换才能正确地进行处理。 下面,我将分享两种解决该问题的方式:…

    python 2023年5月20日
    00
  • python 集合常用操作汇总

    Python 集合常用操作汇总 什么是集合 集合(set)在 Python 中是一种无序且不重复的数据类型,它非常适合用于去重操作。可以使用大括号 {} 或者 set() 函数来创建集合。 集合的常用操作 以下是集合常用的操作汇总: 创建集合 我们可以使用大括号 {} 来创建集合,例如: s = {1, 2, 3} 也可以使用 set() 函数来创建集合,例…

    python 2023年5月13日
    00
  • 详解python实现小波变换的一个简单例子

    一、标题 详解Python实现小波变换的一个简单例子 二、介绍 小波变换是一种用于信号分析和处理的重要方法,具有优秀的局部性和时间-频率特性。该方法已广泛应用于图像处理、音频处理、生物医学信号处理等领域。本文将介绍如何使用Python实现小波变换,并且给出一个简单的实例。 三、小波变换 小波变换是一种基于小波分析的信号分析方法,其原理简单来说就是分解和重构。…

    python 2023年6月3日
    00
  • 详解Python3中的正则表达式的基本用法

    详解Python3中的正则表达式的基本用法 正则表达式是一种用于描述字符串模式的语言,可以用于匹配、查找、替换和割字符串。Python中的re模块提供了正则表达式支持,方便进行字符串的处理。本文将详细讲解Python3中正则表达式的基本用法,包括正则表达式语法、re模块的常用函数以及两个用匹配实例。 正则表达式语法 正则表达式由一些特殊字符普通字符组成,用于…

    python 2023年5月14日
    00
  • python中ASCII码字符与int之间的转换方法

    Python中ASCII码字符与int之间的转换方法 在Python中,我们可以很方便地将ASCII码字符与整数进行相互转换。以下是具体操作方法。 将ASCII码字符转换为int 可以使用Python内置函数ord()将ASCII码字符转换为对应的整数。 # 示例1:将字符’A’转换为对应的整数 num = ord(‘A’) print(num) # 输出:…

    python 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部