资讯专栏INFORMATION COLUMN

Python 从零开始爬虫(三)——实战:requests+BeautifulSoup实现静态爬取

Codeing_ls / 1635人阅读

摘要:前篇全片都是生硬的理论使用,今天就放个静态爬取的实例让大家体验一下的使用,了解一些背后的原理。给出网站打开右键检查第一个电影,分析源码先,发现每个标签就对应着一个电影的信息。

前篇全片都是生硬的理论使用,今天就放个静态爬取的实例让大家体验一下BeautifulSoup的使用,了解一些背后的原理。

顺便在这引入静态网页的概念——静态网页是指一次性加载所有内容的网页,爬虫一次请求便能得到所有信息,对爬虫非常友好,适合练手

豆瓣top250电影信息爬取

这是一个老掉牙的经典实例了,但越是经典,越有示范性作用,最重要的一点是,它是静态的。
给出网站:https://movie.douban.com/top250
打开F12/右键检查第一个电影,分析源码先,发现每个

  • 标签就对应着一个电影的信息。

    我们来爬取每部电影的图片,名称,导演演员,类型,评分,和它的一句话总结,继续对

  • 标签进行分析,又发现信息又在
    标签里,而这标签只存在于
  • 标签中,其它地方不存在,这样可以用find_all()方法把他们全部分离出来。这里不选择
  • 标签是它没有唯一性,电影以外的内容也有
  • 标签

    布置好伪装后就可一开始根据每个

    标签进行信息筛选了:

    图片链接是

    的上上个兄弟标签
    的孙子的src属性的值

    电影名有多个,都在

    标签里,用get_text()把它们串起来

    导演演员是

    标签的第一段字符串

    类型是

    标签的第二段字符串

    评分和评分人数都在

    标签里,又用get_text()串起来

    一句话总结直属于标签

    html中的&NBSP(实际上是小写,这里大写避免markdown识别)对应字符串中的xa0,可用replace方法替换掉

    url = "https://movie.douban.com/top250"
    headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    r=requests.get(url,headers=headers)
    soup = BeautifulSoup(r.text,"lxml")
    
    for each in soup.find_all("div",class_="info"):
        img_url = each.previous_sibling.previous_sibling.a.img["src"]#图片链接
        
        """with open("*.jpg","wb") as img:#还可以顺便下载回来,名字自起
        img.write(requests.get(img_url,headers=headers).content)"""
        
        
        title=each.find("div",class_="hd").get_text(strip=True).replace("xa0","")#标题
        actor = list(each.find("p",class_="").strings)[0].strip().replace("xa0","")#导演演员
        type_ = list(each.find("p",class_="").strings)[1].strip().replace("xa0","")#类型
        score = each.find("div",class_="star").get_text("/",strip=True)#评分及人数
        quote = each.find("span",class_="inq").string#一句话总结
        print([img_url,title,actor,type_,score,quote])#这里只简单打出来看下,怎样存储由你来决定

      但是这样只有25部电影啊,是的,"https://movie.douban.com/top250"指向第一页,我们现在只爬了一页,其实还有9页还没爬啊,这是就要构造网址了。

      我们点到第二页,发现网址变成了https://movie.douban.com/top2...,第三页start条件值变成50,我们可以得出结论,每下一页,start条件值就加25。第一页start=0,第二页start=25.....第十页start=225。这样就可以循环构造网页并爬取了,这交给读者实现
      下面笔者提供另一种思路:网页不是有下一页的按钮吗,右键检查一下,发现它已经包含了要构造的部分了,是一个属性值,提取出来接到原网址上即得到下一页的网址,这样能完全爬取所有页数,不用像上面一样设置循环次数。

    贴上完整代码

    import requests
    from bs4 import BeautifulSoup
    
    
    url = "https://movie.douban.com/top250"
    with open("douban.txt","w",encoding="utf-8") as f:
        while url :
            headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    
            r=requests.get(url,headers=headers)
            soup = BeautifulSoup(r.text,"lxml")
    
            for each in soup.find_all("div",class_="info"):
                img_url = each.previous_sibling.previous_sibling.a.img["src"]
                title=each.find("div",class_="hd").get_text(strip=True).replace("xa0","")
                actor = list(each.find("p",class_="").strings)[0].strip().replace("xa0","")
                #将生成器list化后索引,strip()去除两边空格再用空字符替换 
                type_ = list(each.find("p",class_="").strings)[1].strip().replace("xa0","")
                score = each.find("div",class_="star").get_text("/",strip=True)
                if each.find("span",class_="inq"):#注意有部电影没有总结,也就没有标签这里用if检测一下防止None使用string方法报错
                    quote = each.find("span", class_="inq").string
                else:
                    quote = "没有总结哦"
                print([img_url,title,actor,type_,score,quote])
    
                try:#到最后一页时没有下一页按钮,会报TypeError,这时用try语句让url=None使while循环停止
                    url = "https://movie.douban.com/top250" + soup.find("span",class_="next").a["href"]
                except TypeError:
                    url = None

    本实例的筛选方法已经讲的很细致了,几乎提及了BeautifulSoup的所有方法,希望大家能通过此实例能加深对BeautifulSoup的理解,然后自己手打一些爬虫出来,小的十几行多的几十行都可以,爬贴吧什么的都可以。

    还是那句话“只看不实践的程序员不是好程序员

    下一篇应该会将正则表达式,更加强大也更加难的信息匹配方法
    下下篇了解一下动态爬取?

    文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

    转载请注明本文地址:https://www.ucloud.cn/yun/41578.html

    相关文章

    • Python爬虫基础

      摘要:爬虫架构架构组成管理器管理待爬取的集合和已爬取的集合,传送待爬取的给网页下载器。网页下载器爬取对应的网页,存储成字符串,传送给网页解析器。从文档中获取所有文字内容正则匹配后记爬虫基础知识,至此足够,接下来,在实战中学习更高级的知识。 前言 Python非常适合用来开发网页爬虫,理由如下:1、抓取网页本身的接口相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接...

      bang590 评论0 收藏0
    • python爬虫学习教程,爬取网易云音乐!

      摘要:其次,使用后,还需要针对做特定处理。看到这就可以构想一下爬虫的爬取逻辑了。 运行环境 我的运行环境如下: 系统版本 Windows10。 Python版本 Python3.5,推荐使用Anaconda 这个科学计算版本,主要是因为它自带一个包管理工具,可以解决有些包安装错误的问题。去Anaconda官网,选择Python3.5版本,然后下载安装。 IDE 我使用的是PyCharm,是专...

      Olivia 评论0 收藏0

    发表评论

    0条评论

    最新活动
  • 阅读需要支付1元查看
    <