一条爬虫抓取一个小网站所有数据

这篇具有很好参考价值的文章主要介绍了一条爬虫抓取一个小网站所有数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一条爬虫抓取一个小网站所有数据

​ 今天闲来无事,写一个爬虫来玩玩。在网上冲浪的时候发现了一个搞笑的段子网,发现里面的内容还是比较有意思的,于是心血来潮,就想着能不能写一个Python程序,抓取几条数据下来看看,一不小心就把这个网站的所有数据都拿到了。

一条爬虫抓取一个小网站所有数据

​ 这个网站主要的数据都是详情在HTML里面的,可以采用lxml模块的xpath对HTML标签的内容解析,获取到自己想要的数据,然后再保存在本地文件中,整个过程是一气呵成的。能够抓取到一页的数据之后,加一个循环就可以抓取到所有页的数据,下面的就是数据展示。

一条爬虫抓取一个小网站所有数据

废话少说,直接上Python代码

import requests
import csv
from lxml import etree
import time


class Page:

    def __init__(self):
        self.pre_url = "https://www.biedoul.com"
        self.start_page = 1
        self.end_page = 15233

    def askHTML(self, current_page, opportunity):
        print(
            "=============================== current page => " + str(current_page) + "===============================")
        try:

            pre_url = self.pre_url + "/index/" + str(current_page)
            page = requests.get(url=pre_url)
            html = etree.HTML(page.content)
            articles = html.xpath('/html/body/div/div/div/dl')
            return articles
        except Exception as e:
            if opportunity > 0:
                time.sleep(500)
                print(
                    "=============================== retry => " + str(opportunity) + "===============================")
                return self.askHTML(current_page, opportunity - 1)
            else:
                return None

    def analyze(self, articles):
        lines = []
        for article in articles:
            data = {}
            data["link"] = article.xpath("./span/dd/a/@href")[0]
            data["title"] = article.xpath("./span/dd/a/strong/text()")[0]
            data["content"] = self.analyze_content(article)
            picture_links = article.xpath("./dd/img/@src")
            if (picture_links is not None and len(picture_links) > 0):
                # print(picture_links)
                data["picture_links"] = picture_links
            else:
                data["picture_links"] = []

            # data["good_zan"] = article.xpath("./div/div/a[@class='pinattn good']/p/text()")[0]
            # data["bad_bs"] = article.xpath("./div/div/a[@class='pinattn bad']/p/text()")[0]
            data["good_zan"] = self.analyze_zan(article, "good")
            # article.xpath("./div/div/a[@class='pinattn good']/p/text()")[0]
            data["bad_bs"] = self.analyze_zan(article, "bad")
            # article.xpath("./div/div/a[@class='pinattn bad']/p/text()")[0]
            lines.append(data)
        return lines

    # 解析文章内容
    def analyze_content(self, article):
        # 1. 判断dd标签下是否为文本内容
        content = article.xpath("./dd/text()")
        if content is not None and len(content) > 0 and not self.is_empty_list(content):
            return content

        content = []
        p_list = article.xpath("./dd")
        for p in p_list:
            # 2. 判断dd/.../font标签下是否为文本内容
            if len(content) <= 0 or content is None:
                fonts = p.xpath(".//font")
                for font_html in fonts:
                    font_content = font_html.xpath("./text()")
                    if font_content is not None and len(font_content) > 0:
                        content.append(font_content)

            # 3. 判断dd/.../p标签下是否为文本内容
            if len(content) <= 0 or content is None:
                fonts = p.xpath(".//p")
                for font_html in fonts:
                    font_content = font_html.xpath("./text()")
                    if font_content is not None and len(font_content) > 0:
                        content.append(font_content)

        return content

    def analyze_zan(self, article, type):
        num = article.xpath("./div/div/a[@class='pinattn " + type + "']/p/text()")
        if num is not None and len(num) > 0:
            return num[0]
        return 0

    def do_word(self):
        fieldnames = ['index', 'link', 'title', 'content', 'picture_links', 'good_zan', 'bad_bs']
        with open('article.csv', 'a', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            # writer.writeheader()
            for i in range(self.start_page, self.end_page):
                articles = self.askHTML(i, 3)
                if articles is None:
                    continue
                article_list = self.analyze(articles)
                self.save(writer, article_list)

    # 保存到文件中
    def save(self, writer, lines):
        print("##### 保存中到文件中...")
        # python2可以用file替代open
        print(lines)
        writer.writerows(lines)
        print("##### 保存成功...")

    def is_empty_list(self, list):
        for l in list:
            if not self.empty(l):
                return False
        return True

    def empty(self, content):
        result = content.replace("\r", "").replace("\n", "")
        if result == "":
            return True
        return False

    # 递归解析文章内容
    def analyze_font_content(self, font_html, depth):
        content = []
        print(depth)
        font_content_list = font_html.xpath("./font/text()")
        if font_content_list is not None and len(font_content_list) > 0 and not self.is_empty_list(font_content_list):
            for font_content in font_content_list:
                content.append(font_content)
        else:
            if depth < 0:
                return []
            return self.analyze_font_content(font_html.xpath("./font"), depth - 1)

        return content


if __name__ == '__main__':
    page = Page()
    page.do_word()

在运行下面的代码之前,需要先按照好requests、lxml两个模块,安装命令为:

pip installl requests
pip install lxml

大家对这个爬虫有什么疑问,欢迎给我留言。如果大家对于我这个爬虫创意还不错的话,记得关注微信公众号【智享学习】哟,后续我会分享更多有意思的编程项目。

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-703081.html

到了这里,关于一条爬虫抓取一个小网站所有数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL一条语句递归查询所有子集数据

    MySQL中,现有一组数据,数据包含字段主键:id,父类ID:pid,id与pid是继承关系,根据某个id查询其下级关联的所有记录; 1、利用递归查询语法。递归查询是在 MySQL 8.0 版本引入的新特性,如果您的 MySQL 版本低于 8.0,则无法使用递归查询语法。 在上面的语句中,使用了 Com

    2024年02月11日
    浏览(39)
  • 爬虫数据抓取怎么弄?

    爬虫数据抓取是一种自动化的数据采集技术,可以快速、高效地从互联网上获取大量的数据。本文将介绍爬虫数据抓取的基本原理、常用的爬虫框架和工具、爬虫数据抓取的注意事项以及爬虫数据抓取的应用场景。 一、爬虫数据抓取的基本原理 爬虫数据抓取的基本原理是通

    2024年02月05日
    浏览(27)
  • 逆向爬虫进阶实战:突破反爬虫机制,实现数据抓取

    随着网络技术的发展,网站为了保护自己的数据和资源,纷纷采用了各种反爬虫机制。然而,逆向爬虫技术的出现,使得我们可以突破这些限制,实现对目标网站的深入分析和抓取。本文将介绍逆向爬虫进阶实战的一些技巧和代码片段,帮助读者更好地理解和掌握这一技术。

    2024年02月04日
    浏览(37)
  • 高并发数据抓取实战:使用HTTP爬虫ip提升抓取速度

    又到每天一期学习爬虫的时间了,作为一名专业的爬虫程序员,今天要跟你们分享一个超实用的技巧,就是利用HTTP爬虫ip来提升高并发数据抓取的速度。听起来有点高大上?别担心,我会用通俗易懂的话来和你们说,让你们秒懂怎么操作的。 首先,咱们得理解一下为什么HT

    2024年02月11日
    浏览(35)
  • Python网络爬虫-WebSocket数据抓取

    目录 前言 1、WebSocket请求的分析通常涉及以下几个方面: 2、利用WebSocket爬取数据 总结 最后,创作不易!非常感谢大家的关注、点赞、评论啦!谢谢三连哦!好人好运连连,学习进步!工作顺利哦!  博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作

    2024年04月27日
    浏览(25)
  • 22.网络爬虫—APP数据抓取详讲

    前言 : 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 📝​📝第一篇文章《1.认识网络爬虫》获得 全站热榜第一,python领域热榜第一 。 🧾 🧾第四篇文章《4.网络爬虫—Post请求(实战演示)》 全站热榜第八 。

    2024年02月04日
    浏览(39)
  • 爬虫案例—雪球网行情中心板块数据抓取

    雪球网行情中心网址:https://xueqiu.com/hq 目标:市场一览板块、热股榜板块、新股预告板块、关注排行榜板块 运行结果如下:

    2024年01月19日
    浏览(30)
  • 如何使用 Python 爬虫抓取动态网页数据

    随着 Web 技术的不断发展,越来越多的网站采用了动态网页技术,这使得传统的静态网页爬虫变得无能为力。本文将介绍如何使用 Python 爬虫抓取动态网页数据,包括分析动态网页、模拟用户行为、使用 Selenium 等技术。 在进行动态网页爬取之前,我们需要先了解动态网页和静

    2023年04月24日
    浏览(48)
  • Day:006(2 ) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

    窗口的定位: 对于一个现代的web应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。 有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame中,seelnium webdriver提供了一个switch_to_fram

    2024年04月12日
    浏览(29)
  • Day:006(3 ) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

            有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作。 一般用到操作滚动条的会两个场景: 要操作的页面元素不在当前页面范围,无法进行操作,需要拖动滚动条 注册时的法律条文需要阅读,判断用户是

    2024年04月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包