Heim  >  Artikel  >  Backend-Entwicklung  >  Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?

Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?

Python当打之年
Python当打之年nach vorne
2023-08-15 14:42:31874Durchsuche


Bei der Verwendung dieses Python-Crawlers zum Sammeln von Daten ist ein sehr wichtiger Vorgang das „Extrahieren von Daten aus der angeforderten Webseite“. Der erste Schritt besteht darin, die gewünschten Daten richtig zu lokalisieren. In diesem Artikel werden die

häufig verwendeten Methoden zum Auffinden von Webseitenelementen

in mehreren Python-Crawlern verglichen, damit jeder sie lernen kann

    TraditionellBeautifulSoup operation
  1. BeautifulSoup 操作
  2. 基于 BeautifulSoup 的 CSS 选择器(与 PyQuery 类似)
  3. XPath
    based on BeautifulSoups CSS-Selektor (mit PyQuery ähnlich)
  4. <pre class="brush:php;toolbar:false;">http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1</pre><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="https://img.php.cn/upload/article/001/267/443/21d313e128464b6c1113677cb281678c-1.jpg" alt="Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?" ></figure><p data-tool="mdnice编辑器" style="max-width:90%"> Nehmen wir als Beispiel den Titel der ersten 20 Bücher. Stellen Sie zunächst sicher, dass auf der Website keine Anti-Crawling-Maßnahmen eingerichtet sind und ob sie den zu analysierenden Inhalt direkt zurückgeben kann: </p><pre class="brush:php;toolbar:false;">import requests url = &amp;#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&amp;#39; response = requests.get(url).text print(response)</pre><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="https://img.php.cn/upload/article/001/267/443/21d313e128464b6c1113677cb281678c-2.png" alt="Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?" ></figure><p data-tool="mdnice编辑器" style="max-width:90%">Nach sorgfältiger Prüfung wird festgestellt, dass alle erforderlichen Daten in der Rückgabe enthalten sind Inhalt, was darauf hinweist, dass keine Anti-Crawling-Maßnahmen in Betracht gezogen werden müssen </p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;font-size: 16px;">Überprüfen Sie die Webseitenelemente. Später stellen Sie fest, dass die bibliografischen Informationen in <code style="padding: 2px 4px;border-radius: 4px;margin" enthalten sind rgba mono consolas monaco menlo monospace break-all rgb>li in, untergeordnet zu class ist bang_list clearfix bang_list_mode'sul in Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?li 中,从属于 classbang_list clearfix bang_list_modeulVergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?

    进一步审查也可以发现书名在的相应位置,这是多种解析方法的重要基础Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?

    1. 传统 BeautifulSoup 操作

    经典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通过 soup = BeautifulSoup(html, "lxml") 将文本转换为特定规范的结构,利用 find

    Eine weitere Prüfung kann ebenfalls erfolgen offenbaren die entsprechende Position des Buchtitels, die eine wichtige Grundlage für verschiedene Analysemethoden darstellt. >

    1. Traditionelle BeautifulSoup-Operation

    Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?Die klassische BeautifulSoup-Methode verwendet aus bs4 importieren Sie BeautifulSoup und übergeben Sie dann soup = BeautifulSoup(html, "lxml") Konvertieren Sie Text in eine bestimmte Standardstruktur, indem Sie find Methodenreihe Analyse, der Code lautet wie folgt:
    import requests
    from bs4 import BeautifulSoup
    
    url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39;
    response = requests.get(url).text
    
    def bs_for_parse(response):
        soup = BeautifulSoup(response, "lxml")
        li_list = soup.find(&#39;ul&#39;, class_=&#39;bang_list clearfix bang_list_mode&#39;).find_all(&#39;li&#39;) # 锁定ul后获取20个li
        for li in li_list:
            title = li.find(&#39;div&#39;, class_=&#39;name&#39;).find(&#39;a&#39;)[&#39;title&#39;] # 逐个解析获取书名
            print(title)
    
    if __name__ == &#39;__main__&#39;:
        bs_for_parse(response)

    🎜🎜 20 Buchtitel erfolgreich erhalten. Einige davon sind lang und können über reguläre Ausdrücke oder andere Zeichenfolgenmethoden verarbeitet werden. In diesem Artikel werden sie nicht im Detail vorgestellt

    2. 基于 BeautifulSoup 的 CSS 选择器

    这种方法实际上就是 PyQuery 中 CSS 选择器在其他模块的迁移使用,用法是类似的。关于 CSS 选择器详细语法可以参考:http://www.w3school.com.cn/cssref/css_selectors.asp由于是基于 BeautifulSoup 所以导入的模块以及文本结构转换都是一致的:

    import requests
    from bs4 import BeautifulSoup
    
    url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39;
    response = requests.get(url).text
            
    def css_for_parse(response):
        soup = BeautifulSoup(response, "lxml") 
        print(soup)
    
    if __name__ == &#39;__main__&#39;:
        css_for_parse(response)

    然后就是通过 soup.select 辅以特定的 CSS 语法获取特定内容,基础依旧是对元素的认真审查分析:

    import requests
    from bs4 import BeautifulSoup
    from lxml import html
    
    url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39;
    response = requests.get(url).text
            
    def css_for_parse(response):
        soup = BeautifulSoup(response, "lxml")
        li_list = soup.select(&#39;ul.bang_list.clearfix.bang_list_mode > li&#39;)
        for li in li_list:
            title = li.select(&#39;div.name > a&#39;)[0][&#39;title&#39;]
            print(title)
    
    if __name__ == &#39;__main__&#39;:
        css_for_parse(response)

    3. XPath

    XPath 即为 XML 路径语言,它是一种用来确定 XML 文档中某部分位置的计算机语言,如果使用 Chrome 浏览器建议安装 XPath Helper 插件,会大大提高写 XPath 的效率。

    之前的爬虫文章基本都是基于 XPath,大家相对比较熟悉因此代码直接给出:

    import requests
    from lxml import html
    
    url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39;
    response = requests.get(url).text
    
    def xpath_for_parse(response):
        selector = html.fromstring(response)
        books = selector.xpath("//ul[@class=&#39;bang_list clearfix bang_list_mode&#39;]/li")
        for book in books:
            title = book.xpath(&#39;div[@class="name"]/a/@title&#39;)[0]
            print(title)
    
    if __name__ == &#39;__main__&#39;:
        xpath_for_parse(response)

    4. 正则表达式

    如果对 HTML 语言不熟悉,那么之前的几种解析方法都会比较吃力。这里也提供一种万能解析大法:正则表达式,只需要关注文本本身有什么特殊构造文法,即可用特定规则获取相应内容。依赖的模块是 re

    首先重新观察直接返回的内容中,需要的文字前后有什么特殊:

    import requests
    import re
    
    url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39;
    response = requests.get(url).text
    print(response)
    Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?

    Vergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?观察几个数目相信就有答案了:a7758aac1f23c7126c7b5ea3ba480710eab402ff055639ed6d70ede803486abf 书名就藏在上面的字符串中,蕴含的网址链接中末尾的数字会随着书名而改变。

    分析到这里正则表达式就可以写出来了:

    import requests
    import re
    
    url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39;
    response = requests.get(url).text
    
    def re_for_parse(response):
        reg = &#39;<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">&#39;
        for title in re.findall(reg, response):
            print(title)
    
    if __name__ == &#39;__main__&#39;:
        re_for_parse(response)

    可以发现正则写法是最简单的,但是需要对于正则规则非常熟练。所谓正则大法好!

    当然,不论哪种方法都有它所适用的场景,在真实操作中我们也需要在分析网页结构来判断如何高效的定位元素,最后附上本文介绍的四种方法的完整代码,大家可以自行操作一下来加深体会

    import requests
    from bs4 import BeautifulSoup
    from lxml import html
    import re
    
    url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39;
    response = requests.get(url).text
    
    def bs_for_parse(response):
        soup = BeautifulSoup(response, "lxml")
        li_list = soup.find(&#39;ul&#39;, class_=&#39;bang_list clearfix bang_list_mode&#39;).find_all(&#39;li&#39;)
        for li in li_list:
            title = li.find(&#39;div&#39;, class_=&#39;name&#39;).find(&#39;a&#39;)[&#39;title&#39;]
            print(title)
    
    def css_for_parse(response):
        soup = BeautifulSoup(response, "lxml")
        li_list = soup.select(&#39;ul.bang_list.clearfix.bang_list_mode > li&#39;)
        for li in li_list:
            title = li.select(&#39;div.name > a&#39;)[0][&#39;title&#39;]
            print(title)
    
    def xpath_for_parse(response):
        selector = html.fromstring(response)
        books = selector.xpath("//ul[@class=&#39;bang_list clearfix bang_list_mode&#39;]/li")
        for book in books:
            title = book.xpath(&#39;div[@class="name"]/a/@title&#39;)[0]
            print(title)
    
    def re_for_parse(response):
        reg = &#39;<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">&#39;
        for title in re.findall(reg, response):
            print(title)
    
    if __name__ == &#39;__main__&#39;:
        # bs_for_parse(response)
        # css_for_parse(response)
        # xpath_for_parse(response)
        re_for_parse(response)

Das obige ist der detaillierte Inhalt vonVergleich von vier häufig verwendeten Methoden zur Lokalisierung von Elementen für Python-Crawler. Welche bevorzugen Sie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Python当打之年. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen