python网络爬虫(9)构建基础爬虫思路

python爬虫入门教程(非常详细) 爬虫指的是一种自动化程序,能够模拟人类在互联网上的浏览行为,自动从互联网上抓取、预处理并保存所需要的信息。爬虫运行的过程一般是先制定规则(如指定要抓取的网址、要抓取的信息的类型等),紧接着获取该网址的HTML源代码,根据规则对源代码进行解析和抽取,最后进行处理和保存。爬虫在实际应用中广泛使用,如搜索引擎、大数据分析、交易数据采集等领域,都需要用到爬虫技术来实现信息的定向采集和处理。 阅读详情

阅读目录

目的意义

基础爬虫分5个模块,使用多个文件相互配合,实现一个相对完善的数据爬取方案,便于以后更完善的爬虫做准备。

这里目的是爬取200条百度百科信息,并生成一个html文件,存储爬取的站点,词条,解释。

本文思路来源书籍。其代码部分来源书籍。https://book.douban.com/subject/27061630/

功能模块

主文件:爬虫调度器,通过调用其他文件中的方法,完成最终功能实现。

其他文件:URL管理器,HTML下载器,HTML解析器,数据存储器。

设计思路

定义SpiderMan类作为爬虫调度器。输入根URL开始爬取数据然后爬取结束。

在爬取过程中,需要获取网页,和解析网页。

解析网页需要HTML解析器,获取网页需要HTML下载器。

解析网页需要解析的数据有:URL,TITLE,CONTEXT等。则需要URL管理器和数据存储器。

主文件设计

主文件添加根URL,然后提取该URL,下载该URL内容。

根据内容,调用解析器:

      解析出该URL中的新URL,存入URL管理器;

      解析出该URL中的标题,文本等信息,存入数据存储器。

完成后开始下一次。这时URL管理器多出了新的URL,提取出新的URL,下载,解析,不断重复即可。

重复结束以提取出的URL数量超过200则结束。

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

from BaseSpider.DataOutput import DataOutput

from BaseSpider.HtmlDownloader import HtmlDownloader

from BaseSpider.HtmlParser import HtmlParser

from BaseSpider.UrlManager import UrlManager

class SpiderMan():

    def __init__(self):

        self.manager=UrlManager()

        self.downloader=HtmlDownloader()

        self.parser=HtmlParser()

        self.output=DataOutput()

         

    def crawl(self,root_url):

        self.manager.add_new_url(root_url)

        while(self.manager.has_new_url() and self.manager.old_url_size()<200):

            new_url=self.manager.get_new_url()

            text=self.downloader.download(new_url)

            if text is None:

                print('None text')

                break

            new_urls,data=self.parser.parser(new_url,text)

            self.manager.add_new_urls(new_urls)

            self.output.store_data(data)

            print(self.manager.old_url_size())      

        self.output.output_html()

     

if __name__ == "__main__":

    spider_man=SpiderMan()

    spider_man.crawl("https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711?fr=aladdin")

    print('finish')

作为最初的设计,应该允许异常抛出,便于查看程序终止的原因,然后排查错误。

HTML下载器设计

下载网页,返回文本。即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import requests

import chardet

class HtmlDownloader(object):

    def download(self,url):

        if url is None:

            return None

        user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'

        headers={'User-Agent':user_agent}

        r=requests.get(url,headers=headers)

        if r.status_code is 200:

            r.encoding=chardet.detect(r.content)['encoding']

            return r.text

        return None

    

HTML解析器设计

HTML解析器将下载的文本进行解析,需要解析出的数据有:页面的新URL,页面的新数据文本。

建立相应的解析器,需要打开源码对比,然后进行使用源码分析,使用BeautifulSoup获取所需信息。

为了便于主函数调用或者其他原因,将所有数据通过parser实现返回,其parser分别调用获取URL和获取数据文本的信息。

为了处理一些不同网页可能抓取的意外情况导致程序终止,添加了一些判断。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

import re

from urllib import parse

from bs4 import BeautifulSoup

class HtmlParser(object):

    def parser(self,page_url,html_cont):

        if page_url is None or html_cont is None:

            return

        soup=BeautifulSoup(html_cont,'lxml')

        new_urls=self.getNewUrls(page_url,soup)

        new_data=self.getNewData(page_url,soup)

        return new_urls,new_data

     

    def getNewUrls(self,page_url,soup):

        new_urls=set()

        links=soup.find_all('a',href=re.compile(r'/item/.*'))

        for link in links:

            new_url=link['href']

            new_full_url=parse.urljoin(page_url,new_url)

            new_urls.add(new_full_url)

        return new_urls

     

    def getNewData(self,page_url,soup):

        data={}

        data['url']=page_url

        title=soup.find('dd',class_="basicInfo-item value")

        if title is not None:

            data['title']=title.string

            summary=soup.find('meta',attrs={"name":"description"})

            data['summary']=summary['content']

            return data

        else:

            title=soup.find('meta',attrs={"name":"keywords"})

            if title is not None:

                data['title']=title['content']

                summary=soup.find('meta',attrs={"name":"description"})

                data['summary']=summary['content']

                return data

            else:

                data['title']="ERROR!"

                data['summary']="Please check the url for more information"

                data['url']=page_url

                return data

URL管理器设计

为了避免重复的URL,使用python的set,建立集合初始化。参阅:https://www.runoob.com/python3/python3-set.html

使用old_urls存储已经访问过的网址,使用new_urls存入将要提取的网址。

然后写好has_new_url等方法,辅助主程序调用。当得到新的URL们时,主程序调用函数将他们存入。

而主程序需要的其他URL管理方案,如提取,数量判定等,也在这里实现。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

class UrlManager():

    def __init__(self):

        self.old_urls=set()

        self.new_urls=set()

        pass

     

    def has_new_url(self):

        return self.new_url_size()!=0

     

    def new_url_size(self):

        return len(self.new_urls)

     

    def old_url_size(self):

        return len(self.old_urls)

     

    def get_new_url(self):

        new_url=self.new_urls.pop()

        self.old_urls.add(new_url)

        return new_url

     

    def add_new_url(self,url):

        if url is None:

            return

        if url not in self.new_urls and url not in self.old_urls:

            self.new_urls.add(url)

        pass

     

    def add_new_urls(self,urls):

        if urls is None or len(urls) == 0:

            return

         

        for url in urls:

            self.add_new_url(url)

        pass

数据存储器设计

通过HTML解析器获取的数据,通过数据存储器进行存储。

而最终将数据从内存写入到本地磁盘,也在该文件实现。

为了调试美观,建议是先爬取一两个数据做好测试,写好table的宽度设定,加入style='word-break:break-all;word-wrap:break-word;'参数。参阅:https://zhidao.baidu.com/question/1385859725784504260.html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

import codecs

class DataOutput(object):

    def __init__(self):

        self.datas=[]

     

    def store_data(self,data):

        if data is None:

            return

        self.datas.append(data)

     

    def output_html(self):

        fout=codecs.open('baike.html', 'w', encoding='utf-8')

        fout.write("<html>")

        fout.write("<head><meta charset='urf-8'></head>")

        fout.write("<body>")

        fout.write("<table border='1' width=1800  style='word-break:break-all;word-wrap:break-word;'>")

        fout.write("<tr>")

        fout.write("<td width='300'>URL</td>")

        fout.write("<td width='100'>标题</td>")

        fout.write("<td width='1200'>释义</td>")

        fout.write("</tr>")

        for data in self.datas:

            fout.write("<tr>")

            fout.write("<td><a href=%s>%s</a></td>"%(data['url'],data['url']))

            fout.write("<td>%s</td>"%data['title'])

            fout.write("<td>%s</td>"%data['summary'])

            fout.write("</tr>")

        fout.write("</table>") 

        fout.write("</body>")     

        fout.write("</html>")

        fout.close()

            

最终效果:

当然还有一些数据没有处理好。

 

(不看后悔系列三)python网络爬虫爬取网络视频 同样,我们先来看效果图前面的文章发布后,很多人反应看不太懂。其实,爬取网络视频的关键在于数据分析。只有在对数据进行深入分析之后,再着手编写。为了更好地理解,今天我们选择一个简单的网站进行分析。该网站不涉及任何加密,能够方便快捷地提取我们所需的。但是在分析该网站之前你还是要对什么是m3u8,什么是ts等进行了解。如果你还不了解,请看这里m3u8,ts。 阅读详情

相关推荐

python爬虫代码-python网络爬虫源代码(可直接抓取图片)

在开始制作爬虫前,我们应该做好前期准备工作,找到要爬的网站,然后查看它的源代码我们这次爬豆瓣美女网站,网址为:用到的工具:pycharm,这是它的图标...博文来自:zhang740000的博客Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有所耳闻,会觉得是一个高大上的东西,仿佛九阳神功和乾坤大挪移一样,和别人说"老子会爬虫”,就感觉特别有逼格,但是又不知从何...

q6q6q的专栏 3662

爬虫项目笔记(二):scrapy的main

python 没有理解中的main()方法,但是有if name == “main” 这可以看成是python程序的入口 Scrapy默认是不能在IDE中调试的,所以 from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'zf']) 第二行中代码中的前两个参数是不变的,第三个参数是自己的spider的名字。 ...

qq_17019229的博客 1189

python如何爬虫网页数据-python网络爬虫爬取网页内容

1.什么是网络爬虫?网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。换言之,如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取...

weixin_37988176的博客 2219

【浅谈爬虫】一文解析分布式爬虫框架Scrapy的原理图与项目结构说明

我们做web开发需要框架,因为框架能让我们快速去开发,开发的过程更加规范、避免了重复造轮子的操作。而爬虫领域也有很多优秀的框架,其中分布式爬虫框架Scrapy在github上得分比较高,深受爬虫人员的喜爱。 Scrapy爬虫框架是一个爬取效率高、相关扩展组件多,为了提取结构性数据而编写的开源框架。Scrapy的用途非常广泛,不仅可以应用到网络爬虫中,还可以用于数据挖掘、数据监测以及自动化测试等。 Scrapy是基于Twisted的异步处理框架,架构清晰、可扩展性强,可以灵活地完成各种需求。 一、详细理解Sc

量化Mike 1897

Python实现多线程网络爬虫工具的设计与应用

本文还有配套的精品资源,点击获取 简介:Python多线程网络爬虫是一种高效的网络数据抓取方法。本项目介绍了一个基于Python的爬虫工具,利用 requests 、 BeautifulSoup 、 re 、 threading 和 queue 等库,实现多线程快速抓取和处理互联网链接数据。工具包含初始化...

weixin_36231030的博客 1672

旅行青蛙破解汉化教程——蹭个热度

汉化破解版资源(无尽三叶草与点券): https://github.com/wisdombyzf/lxqw/blob/master/lxqw_zf.apk 截图: 破解方法: 工具: 1,APKIDE https://www.pd521.com/thread-818-1-2.html 2,dnspy https://down.52pojie.

github_38838414的博客 3785

超级简单的python爬虫详细教程!!

好了,今天的分享就到这里了,拜拜~哎?忘了一件事,再给你们一个爬取天气的代码!'''存放天气情况''''''存放日期'''i = 0if i

2301_78096295的博客 2243

Docker部署FRP实现内网穿透

FRP是一款开源内网穿透工具,通过在公网服务器部署服务端(FRPS),内网设备运行客户端(FRPC)实现外部访问。支持TCP、UDP、HTTP等多种协议。部署时需配置服务端(如群晖NAS使用Docker)和客户端(如Windows下载可执行文件)。服务端需设置监听端口、控制面板及Token认证,客户端需指定服务器地址和相同Token。完成配置后可通过公网IP或域名访问内网资源,并在控制面板监控连接状态。

波哥技术栈 1599

python爬虫设计思路_python网络爬虫(9)构建基础爬虫思路

目的意义基础爬虫分5个模块,使用多个文件相互配合,实现一个相对完善的数据爬取方案,便于以后更完善的爬虫做准备。这里目的是爬取200条百度百科信息,并生成一个html文件,存储爬取的站点,词条,解释。功能模块主文件:爬虫调度器,通过调用其他文件中的方法,完成最终功能实现。其他文件:URL管理器,HTML下载器,HTML解析器,数据存储器。设计思路定义SpiderMan类作为爬虫调度器。输入根URL开...

weixin_39996101的博客 822

飞腾E2000单板移植openEuler 5.10内核与麒麟系统的实践指南

本文详细介绍了在飞腾E2000单板上移植openEuler 5.10内核并搭配麒麟系统根文件系统的完整实践指南。内容涵盖从编译环境搭建、内核配置裁剪、设备树适配,到根文件系统准备、U-Boot引导配置及启动调试的全流程,旨在帮助开发者打造一个内核版本新、软件生态全的稳定混合系统。

weixin_29309475的博客 259

别让 Claude Code 一直问你“能不能执行“:权限配置完全指南

Claude Code 提供了一套精细的权限配置机制,配置好权限设置,可以提速不少。这个小技巧需要掌握一下。

沐风 3843

python写爬虫思路_python网络爬虫(9)构建基础爬虫思路

目的意义基础爬虫分5个模块,使用多个文件相互配合,实现一个相对完善的数据爬取方案,便于以后更完善的爬虫做准备。这里目的是爬取200条百度百科信息,并生成一个html文件,存储爬取的站点,词条,解释。功能模块主文件:爬虫调度器,通过调用其他文件中的方法,完成最终功能实现。其他文件:URL管理器,HTML下载器,HTML解析器,数据存储器。设计思路定义SpiderMan类作为爬虫调度器。输入根URL开...

weixin_39529302的博客 63

uni-app - 在纯 JS 文件中调用自定义弹框组件 / 封装全局 API 调用弹框组件(解决小程序、APP 无法使用 document.body.appendChild 插入组件节点)适配全端

uni-app-在纯JS文件中调用自定义弹框组件/封装全局API调用弹框组件(解决小程序、APP无法使用document.body.appendChild插入组件节点)适配全端,uni-appappendChild怎么向小程序中插入节点,如何开发类似uni.showModal全局组件。h5端可以通过document.body.appendChild挂载,请问app跟微信小程序怎么弄,请问uniapp如何封装全局api调用弹窗组件?uniapp怎么设置所有页面共用的组件Uni

🏆 前端领域优质创作者 1万+

使用python编写网络爬虫

使用python编写网络爬虫前言1、为何使用爬虫2、编写爬虫的知识要求3、确定爬虫使用的工具库4、确定要获取的数据集4.1 分析Url地址变化4.2 获取目标数据集所在的HTML区域如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 此篇文章是本人编写爬虫获取数据的心得体会,涉及到数据收集、数据预处理

qq_44092306的博客 7755

自注意力机制(SelfAttention Mechanism)原理与代码实战案例讲解

自注意力机制(Self-Attention Mechanism)原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍

AI天才研究院 1290

嵌入式工程师必学(118):MCU的硬件定时器和中断

大多数微处理器都有一个或多个可编程硬件定时器,这些定时器包括对中断的支持。可以有不同类型的计时器,用于不同的应用程序。例如,LPC1768 具有四个 32 位通用定时器、一个看门狗定时器、一个重复中断定时器、一个系统滴答定时器、一个正交编码器接口、6 个 PWM 输出和一个支持中断的实时时钟。硬件定时器用于计时和计数作,允许处理器在 timer 进程运行时继续执行其他进程。硬件定时器是一种使用 clock 信号来增加 register 的电路。

码农17年的博客 211

Python爬虫——网络爬虫简介

网络爬虫(Web Spider)又称“网络蜘蛛”或“网络机器人”,它是一种按照一定规则从互联网中获取网页内容的程序或者脚本。网络爬虫会模拟人使用浏览器,上网自动抓取互联网中数据。Python 爬虫指的是用 Python来编写爬虫程序。其他语言也可以编写爬虫,如 Java、PHP 、C/C++等,不过相比而言,Python 语法优美、代码简洁、开发效率高、支持多个爬虫模块,比如 urllib、requests、Bs4 等。Python 的请求模块和解析模块丰富成熟,并且还提供了强大的 Scrapy 框架,让编

万里顾一程的博客 3098

ArtMate —— 美术公开课智能体开发全记录

本文档详细描述了一款专为中小学美术公开课设计的智能教学助手的开发过程。该智能体融合了多模态感知、自然语言交互、风格迁移与智能评价等技术,旨在辅助教师开展生动、高效的美术鉴赏与创作课程。全文包含需求分析、系统架构设计、核心模块代码实现、交互界面搭建及完整运行示例,并配有详尽的行内注释和设计思想阐述,为教育技术开发者提供一份可落地、可扩展的参考方案。

huanghm88的专栏 153

网络爬虫之Selenium(可视化)爬虫

一、网络爬虫介绍 1、什么是爬虫: 网络爬虫(web crawler)也叫网页蜘蛛,网络机器人,是一种用来自动浏览万维网的程序或者脚本。爬虫可以验证超链接和HTML代码,用于网络抓取(Web scraping)。网络搜索引擎等站点通过爬虫软件更新自身的网站内容(Web content)或其对其他网站的索引。 2、爬虫的由来(为什么会有爬虫): 随着时代的发展,信息时代引领时代潮流,但我们到网上去搜集信息时,查找网上的海量信息就像大海捞针,森罗万象,要提取到对我们有用的信息,我们...

boy_10的博客 4798

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

网络爬虫“一课一得”

HTTP协议:HTTP(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。它用于从服务器传输超文本到本地浏览器。了解HTTP协议的基本请求方法(GET、POST等)、请求头、响应头、状态码等对于编写和理解网络爬虫至关重要。URL:URL(Uniform Resource Locator)是互联网上用来标识和定位资源的字符串。它指定了如何访问互联网上的资源。了解URL的组成(协议、域名、路径、查询参数等)以及如何进行URL编码是爬虫编写过程中的基础知识。

2201_75463924的博客 1739

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python网络爬虫_Python网络爬虫和文本分析!

文本大数据分析在社科学术研究中的应用方兴未艾。本文以搜集长沙市历年政府工作报告,并统计其中与环境规制相关的词汇出现频次这一问题为例,基于python3,介绍网络爬虫和文本分析的基本工作原理,算法设计和实践操作。问题笔者在研究环境规制对出口企业行为的影响时,在计量分析中需要为地区环境规制指标选取一个合适的工具变量,以解决内生性问题。现有文献(Chen et al.(2016)、陈诗一和陈登科(201...

weixin_39796140的博客 2666

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

网络爬虫01

网络爬虫(又称为网页蜘蛛,网络机器人)模拟客户端发送网络请求,接受请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。只要是浏览器能做的事情,原则上,爬虫都能做。

computet_的博客 1317

python实验七 网络爬虫和文本处理

词干提取的结果可能并不是完整的、具有意义的词, 而只是词的一部分,如“revival”词干提取的结果为“reviv”,“ailiner”词干提取的结果为“airlin”。词形还原与词干提取相关,不同的是,词形还原更为复杂,不仅要进行词缀的转化,还要进行词性识别,区分相同词形但原形不同的词的差别,能够捕捉基于词根的规范单词形式。不同的中文词法分析软件结果差别不大,在不同数据集上的表现互有高低。由于字的粒度太小,无法表达完整含义,而句子的粒度太大、承载的信息量多,很难复用,因此,词是一个比较合适的粒度。

木子一个Lee的博客 3379
上一篇: Python爬虫神器pyppeteer,对 js 加密降维打击
下一篇: 99% 的人都倒在了入门的门口
程序员林子
博客等级 码龄7年 369粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值