码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 网络爬虫流程总结


    网络爬虫的大体流程其实就是解析网页,爬取网页,保存数据。三个方法,就完成了对网页的爬取,并不是很困难。以下是自己对流程的一些理解和总结,如有错误,欢迎指正。

    一、解析网页,获取网页源代码

    首先,我们要了解我们要爬取的网页,以豆瓣为例,我们要了解模拟浏览器头部信息,来伪装成浏览器。以及爬取的内容是什么,方便我们在后面爬取的过程中用正则表达式匹配内容,以便爬取。

    首先我们打开我们需要爬取的网页,f12打开开发者模式,在network中找到发出的请求,获取我们想要的头部信息。

    其中模拟浏览器的头部信息我们通常使用urllib库,主要是里面的request类。我们先定义一个对象req,然后获取其中的头部信息,用urllib.request.Request方法对获取的头部信息进行封装并保存到req对象中,代码如下:

    req = urllib.request.Request(url=url,data=data,headers=headers,method="POST")
    

    然后再用urllib.request.urlopen获取网页源码,代码如下

    response = urllib.request.urlopen(req)
    

    之后再设置一个对象进行存储,代码如下:

     html = response.read().decode("utf-8")
    

    总体代码:

    import urllib.request
    import urllib.parse
    url = "http://httpbin.org/post"
    data = bytes(urllib.parse.urlencode({"name":"eric"}),encoding='utf-8')
    headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50",
        "X-Amzn-Trace-Id": "Root=1-63f48078-2f75544f15e5c54a7b905e25"
    }
    req = urllib.request.Request(url=url,data=data,headers=headers,method="POST")
    response = urllib.request.urlopen(req)
    #print(response.read().decode("utf-8"))
    html = response.read().decode("utf-8")
    

    因为我们爬取的网页不止一页,例如爬取豆瓣影视top250,京东评论,这些都会分页,我们爬取会连续爬取很多页,所以我们通常将这一步设为一个方法askUrl(),用于获取单个指定url网页的内容。另外,有些网页会有相应的防御措施,我们有可能会爬取失败,所以,我们通常会try catch来保证代码能够运行,整体代码如下:

    def askUrl(url):
        head = {        #模拟浏览器头部信息,向豆瓣服务器发送消息
            "User-Agent": "Mozilla / 5.0(Linux; Android 6.0; Nexus 5 Build / MRA58N) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 110.0.0.0 Mobile Safari / 537.36 Edg / 110.0.1587.50"
        }
                #用户代理:告诉豆瓣服务器我们是什么类型的机器、浏览器,本质上是告诉服务器,我们可以接受什么样的文件内容
        request = urllib.request.Request(url,headers=head)
        html = ""
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
            # print(html)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"reason"):
                print(e.reason)
    
        return html
    

    另外,我们还要在网页中找到我们需要爬取内容的标签,同样是开发者模式,点击箭头,在网页中选取要爬取的内容,在最下面就能看到所在的标签层次。如下图:

    二、爬取网页,解析数据

    现在我们有了网页的源代码,但是我们想要的只是网页内容的一部分,这时我们就需要解析网页的数据,利用正则表达式匹配我们想要的内容,并将其存储下来。这时我们主要用到bs4中的BeautifulSoup库。我们首先定义一个对象soup,利用BeautifulSoup解析我们上一步获得的网页源代码,并存储在soup中,代码如下:

    soup = BeautifulSoup(html,"html.parser")
    

    随后我们利用findall方法,查找符合要求的字符串。因为网页大多是一个个div的组合,而且爬取的第一页和之后的页数都有一定的共性,所以我们直接for循环来爬取。这个时候就要我们自己上一步找所在的标签了。这里我用爬取豆瓣举例,我先定义变量,再利用compile方法获取想要内容的正则表达式并存储在变量中。

    #影片详情的规则
    findLink = re.compile(r')
    

    又因为爬取的内容比较多,所以我们设置getData方法,在方法中我们先定义一个列表,用来存储我们爬取的数据,然后爬取一页数据,放到for循环中爬取需要的页数。

    #影片详情的规则
    findLink = re.compile(r')
    #影片图片的规则
    findImgSrc = re.compile(r',re.S)
    
    def getData(baseurl):
        datalist = []
        for i in range(0,10):
            url = baseurl + str(i * 25)
            html = askUrl(url)
    
            # 2.逐一解析数据
            soup = BeautifulSoup(html,"html.parser")
            for item in soup.find_all("div",class_ = "item"):   #查找符合要求的字符串,形成列表
                # print(item)         #测试:查看电影item全部信息
                # break
                data = []
    
                item = str(item)
                #影片详情的链接
                link = re.findall(findLink,item)[0]     #re库通过正则表达式查找指定的字符串
                data.append(link)           #添加链接
    
                imgSrc = re.findall(findImgSrc,item)[0]
                data.append(imgSrc)         #添加图片
    
                datalist.append(data)           #把处理好的一部电影信息放入dataList
    
        # print(datalist)
        return datalist
    
    

    这里嵌套了for循环语句,实战中如何嵌套来爬取需要的内容我认为是个难点,这里需要我们多注意,多思考。

    三、保存数据

    我们可以将数据保存到excel和数据库中,我以excel来举例,其实都是大同小异。其中excel需要xwlt库,我们先创建workbook对象,再利用其创建工作表:

        workbook = xlwt.Workbook(encoding="utf-8",style_compression=0)
        worksheet = workbook.add_sheet("豆瓣电影top250",cell_overwrite_ok=True)
    

    然后我们在工作表中写入数据:

        col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
        for i in range(0,8):
            worksheet.write(0,i,col[i]) #列名
        for i in range(0,250):
            print("第%d条"%(i+1))
            data = datalist[i]
            for j in range(0,8):
                worksheet.write(i+1,j,data[j])
    

    这边需要注意的是,如果存储到数据库中,将内容转换切割又是一个难点,也需要我们多注意,多思考。之后我们保存数据表即可:

        workbook.save(savepath)
    

    通常我们把保存数据单独写成一个方法,方便代码观看和重用。

    最后

    我们在main方法中运行前面三个方法即可,我们就爬取了我们想要的内容。爬取的流程并不难理解,其中的难点在于对爬取内容的处理,例如如何找到爬取内容,如何匹配,如何分割存储。另外想要看源代码的可以看我这一篇博客:
    手把手教你网络爬虫(爬取豆瓣电影top250,附带源代码)
    两篇博客一起学习分析,才能更好的理解掌握,如果对代码中用的方法不理解,可以看我分类中python+爬虫学习的模块,里面记录了我学习的过程和代码讲解。还有我学习是看的b站课程:
    Python课程天花板,Python入门+Python爬虫+Python数据分析5天项目实操/Python基础.Python教程,老师讲的比我的博客要细致很多,我的博客只是自己的总结理解,与大家交流学习。

  • 相关阅读:
    小白快速自建博客--halo博客
    2023NOIP A层联测25-游戏
    docker nacos安装,注册,配置,测试
    Linux操作系统中的yum命令
    如何借助ai(文心一言)获取tushare的数据
    spring常见问题汇总
    [经验]如何解决python环境中的版本冲突问题
    Annealing-based Label-Transfer Learning for Open World Object Detection(论文解析)
    【Unity】Unity寻路系统讲解及Navigation实际应用
    python-tkinter-在文本框预设内容
  • 原文地址:https://www.cnblogs.com/he-cheng/p/17201301.html
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号