整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          小R智能編程機器人

          小R智能編程機器人

          東眾籌網址鏈接:https://z.jd.com/project/details/1816856838.html

          編程是不是該從小學起,看完這篇,或許你心中會有答案

          假如你也曾經是個游戲迷,那么,這款曾風靡一時的《我的世界》,相信你應該不會太過陌生。


          在這款極具開放性的游戲里,玩家能夠憑借自己無盡的想象力,打造、創造一個只屬于自己的世界,這就是《我的世界》的魅力。


          其實,早在很久以前,許多家長,培訓機構,甚至是校園,就已經意識到了樂高對孩子智力開發的重要性。加強孩子這方面的培養和教育,一來能夠培養孩子的空間想象力,二來還能培養孩子的自我創造能力。


          倘若再將編程的思維融入其中,甚至還能培養孩子的機器人設計能力,同時在這個過程中,提高他們的專注能力。

          正因為發現了編程的重要性,甚至連國家都“強插一手”,在部分地區,將計算機編程這門科目,納入了高考。

          其實,早在2016年的美國,政府就已經將計算機編程的成績算進了高中畢業的學分之中;而2017年的英國,甚至都將學習編程這項科目,納入了小學必修課程當中。我們在這個時候才意識到編程的重要性,雖然還不算太遲,但若不開始抓緊,那就很有可能再一次與世界拉開一段距離。


          其實仔細想想就會明白,無論是被人們封神的蘋果創始人喬布斯、或是福布斯首富兼微軟創始人比爾蓋茨無一不是從小就開始學習編程,然后終此一生投身于科技事業,這些無一不在編程的重要性。

          那么,問題就來了,應該如何從小開始學習編程呢?是應該加入培訓班嗎?畢竟編程這種的課程不是語數英,一般父母很少接觸,想讓每個父母在孩子小的時候就手把手教,這并不現實。


          其實吧,學習這種東西,最重要看興趣,在孩子小的時候就強行將孩子送入教育“味道”過于濃厚的培訓機構中,不僅可能無法讓孩子對編程產生興趣,甚至會讓孩子未來對編程這門課產生陰影。因此,娛樂性就很重要了。

          其實讓孩子從小開始接觸編程的話,給孩子選一臺兼具娛樂性和教育性的編程機器人是一個不錯的選擇。在這一方面,小二極客團隊就很有發言權了。


          這是一個深耕編程機器人開發多年的專業團隊,在提供了小R編程機器人系列的同時,還提供了易用的套件、先進的代碼結構、快捷的開發方式,更重要的是,還提供了一整套易入門的電子類課程,全面為孩子們提供了一套以寓教于樂為中心的系統教育教學機器人系列。

          說到小R編程機器人,不得不安利一下這款由小二極客團隊最新研發的這款人形機器人了。

          人形的外觀,對于孩子來說,是具有絕對的親切感的。這樣的設計,打破了以往機器人給人的冰冷的感覺。


          還注入了多種多樣的互動元素。

          摸摸頭,自行啟動賣萌技能

          來一段節奏,跳個舞給你看

          還能做指南針,幫孩子復習一下地理

          這些事先設定好的程序代碼,孩子既可以通過軟件直接導入,也可以自行重新編入,有趣好玩,孩子學起來也開心。

          至于編程的開發板也很良心,是可以兼容業內常用的micro:bit編程方式的開發板,在中小學生編程教育中十分流行,編程畫面十分有趣,孩子可以輕松上手。

          手機端、PC端都可用,孩子喜歡用哪個平臺就用哪個平臺。

          還有一整套完善的編程課程,讓孩子學習編程就像玩一樣簡單。

          除了編程,他還是孩子休閑是的遙控機器人,閑暇時候,還能跟隔壁孩子一起來場“機器人”對決。

          現在,這款小R編程機器人正在京東眾籌平臺火熱眾籌中,登陸京東眾籌頁面,輸入關鍵詞“小R智能編程機器人”即可了解更多詳情。

          • 基本使用
            • 發送請求
            • 解析響應獲
          • 獲取需要的內容
            • 快速獲取鏈接
            • 獲取元素
          • 高級功能
            • JS渲染
            • 自動翻頁(不太好用)
          • 異步
            • 異步渲染JS
            • 異步發送請求

          初識requests_html模塊

          感覺只要學過Python爬蟲的同學應該都知道requests這個庫吧,它在我們的Python爬蟲任務中應該是最常用的一個庫了!今天跟大家分享的這個模塊requests_html,他的作者和前者是同一人!這是一個解析HTML的庫,用起來和requests一樣方便,下面就來介紹一下它!

          • 參考視頻

          使用requests_html

          安裝

          • 依然是那個命令 pip3 install -i https://pypi.doubanio.com/simple requests_html
          • 注意:由于requests_html模塊中使用了異步asynico模塊,所以官方聲明,需要在python3.6以上版本才能正常使用!

          基本使用

          發送請求

          • requests_html發送請求獲取頁面需要先實例化一個HTMLSession對象,然后使用get/post...方法獲取響應,如下列代碼
          #!/usr/bin/env python3
          # coding     : utf-8
          # Author     : xiao qiang
          # 微信公眾號   : xiaoqiangclub
          # Software   : PyCharm
          # File       : test.py
          # Time       : 2021/5/29 7:57
          from requests_html import HTMLSession
          
          if __name__ == '__main__':
              url = 'https://wwww.baidu.com'
              session = HTMLSession()  # 獲取實例化session對象
              r = session.get(url)    # 這里的請求和requests的幾乎一樣!同樣可以根據需要添加headers等參數
          
          • requests_html發送請求的方式和requests中使用session方式發送請求幾乎是一樣的,可以對比參考
          • requests_html同樣可以發送get/post等請求,且可以和requests同樣攜帶headers/data等參數,具體用法參考requests

          解析響應獲

          • 接上,我們需要將獲取的響應解析獲取html頁面,在這里我們同樣可以使用requests中的r.content.decode()等原方法!
          • 但是在requests_html中還提供了更便捷的方法:r.html.html
          • r.html.html實際上是使用了requests_html中的HTML類(負責對HTML進行解析)來進行解析!如下
          #!/usr/bin/env python3
          # coding     : utf-8
          # Author     : xiao qiang
          # 微信公眾號   : xiaoqiangclub
          # Software   : PyCharm
          # File       : test.py
          # Time       : 2021/5/29 7:57
          from requests_html import HTMLSession
          
          if __name__ == '__main__':
              url = 'https://wwww.baidu.com'
              session = HTMLSession()  # 獲取實例化session對象
              r = session.get(url)  # 這里的請求和requests的幾乎一樣!同樣可以根據需要添加headers等參數
          
              # 獲取html頁面
              # html = r.content.decode()  # requests方式
              get_html = r.html.html  # requests_html中的方法
              print(get_html[:15], '...')
          
          • 運行結果(這里只顯示了部分結果!)

          獲取需要的內容

          快速獲取鏈接

          • requests_html中提供了快速獲取網址鏈接的方法
          • 使用linksabsolute_links兩個屬性分別可以返回HTML對象所包含的所有鏈接和絕對鏈接(均不包含錨點)
          # 快速獲取鏈接
          pprint(r.html.links)  # 獲取html中的鏈接(href屬性)
          pprint(r.html.absolute_links)  # 會自動拼接url生成絕對鏈接
          
          • 部分運行結果如下

          獲取元素

          • requests_html中的HTML對象可以直接使用xpathcss選擇器

          使用xpath

          • requests_html中的HTML對象支持xpath語法,它有以下幾個參數:
          def xpath(self, selector: str, *, clean: bool = False, first: bool = False, _encoding: str = None) -> _XPath:
          - selector,要用的 xpath選擇器;
          - clean,布爾值,如果為True,會清除HTML中style和script標簽;
          - first,布爾值,如果為True,會返回第一個元素,否則會返回滿足條件的元素列表;
          - _encoding,編碼格式。
          
          • 接上面的例子!使用獲取到的響應得到HTML對象r.html
          pprint(r.html.xpath('//li[@class="hotsearch-item odd"]/a'))
          pprint(r.html.xpath('//li[@class="hotsearch-item odd"]/a', first=True).text)
          
          • 運行結果
          • xpath語法

          使用css選擇器(find方法)

          • requests_html中的HTML對象支持css選擇器,它有以下幾個參數:
          def find(self, selector: str = "*", *, containing: _Containing = None, clean: bool = False, first: bool = False, _encoding: str = None) -> _Find:
          - selector,要用的CSS選擇器;
          - clean,布爾值,如果為True,會清除HTML中style和script標簽;
          - containing,如果設置該屬性,只返回包含該屬性文本的標簽;
          - first,布爾值,如果為True,會返回第一個元素,否則會返回滿足條件的元素列表;
          - _encoding,編碼格式。
          
          • 接上面的例子!使用獲取到的響應得到HTML對象r.html
          pprint(r.html.find('a.mnav'))
          pprint(r.html.find('a.mnav', first=True).text)
          
          • 運行結果
          • css選擇器語法
          • 可以使用text屬性來獲取元素的文本內容

          pprint(r.html.find('a.mnav')[0].text)

          • 執行結果
          • 如果要獲取元素的attribute,用attrs屬性

          pprint(r.html.find('a.mnav')[0].attrs)

          • 執行結果
          • 獲取到attrs屬性后,就可以使用字典的相關方法獲取內容了!
          • 最后還可以使用html屬性獲取一個元素的html代碼,如下

          pprint(r.html.find('a.mnav')[0].html)

          • 執行結果

          正則搜索(search、search_all)

          • requests_html除了上面的方式還可以使用search/search_all來直接搜索內容,返回的是一個Result對象/Result對象列表實際上是作者將re正則進行了封裝)!
          def search(self, template: str) -> Result:
          # 只有一個參數
          template: 就是要檢索的內容,這里使用英文狀態的 {} 來獲取內容,有點類似正則里面的 ()
          
          • 使用英文狀態的 {} 來獲取內容,如下
              ret = r.html.find('a.mnav')[0].search('新{}')
              pprint(ret)
              pprint(type(ret))
              pprint(ret[0])
          
          • 執行結果
          • search()獲取到的是第一個匹配的對象,而searchh_all()則是獲取所有匹配的對象,得到的是一個列表,如下

          ret=r.html.find('a.mnav')[0].search_all('新{}')
          pprint(ret)
          pprint(type(ret))
          pprint(ret[0][0])

          • 運行結果
          • 除了對某個元素進行檢索外,還可以直接對html對象進行搜索,如下

          ret=r.html.search_all('百度{}')
          pprint(ret)
          pprint(type(ret))
          pprint(ret[0][0])

          • 運行結果
          • requests_html內容提取的方式這么多,大家可以根據需要和習慣選擇使用!

          search補充

          • 在上面提到的search()/search_all()方法中,我們設定的template參數可以有多個取值(多個{}),得到的結果是一個列表,我們可以遍歷別表進行取值 取值的時候可以通過result[索引]的方式進行獲取對應的數據,如下(示例部分代碼) search_ret=r.html.search_all('<a h{}f="{}"',)
            print(search_ret)
            for ret in search_ret:
            print(ret)
            print(ret[1])
            print('--------------')
            運行結果(部分)
          • 除此之外,我們還可以對取值進行命名,返回的結果是可以使用類似字典(不是字典)[name]的方式取值(不能使用get),如下示例(部分代碼) search_ret=r.html.search_all('<a h{test}f="{url}"',)
            print(search_ret)
            for ret in search_ret:
            print(ret)
            print(ret['name'])
            print('--------------')
          • 運行結果(部分)
          • 以上就是對requests_html模塊search()/search_all()方法的補充內容!

          HTML類

          • requests_html中使用HTML類負責對HTML進行解析
          • HTML類不僅可以解析網絡請求獲取的響應,還可以直接解析html文本,如下
          >>> from requests_html import HTML
          >>> doc = """<a href='https://www.baidu.com'>"""
          
          >>> html = HTML(html=doc)
          >>> html.links
          {'https://www.baidu.com'}
          
          • 還可以直接渲染JS,如下
          # 和上面一段代碼接起來
          >>> script = """
                  () => {
                      return {
                          width: document.documentElement.clientWidth,
                          height: document.documentElement.clientHeight,
                          deviceScaleFactor: window.devicePixelRatio,
                      }
                  }
              """
          >>> val = html.render(script=script, reload=False) # render()方法 后面會講
          
          >>> print(val)
          {'width': 800, 'height': 600, 'deviceScaleFactor': 1}
          
          >>> print(html.html)
          <html><head></head><body><a href="https://www.baidu.com"></a></body></html>
          

          高級功能

          • 前面介紹的是requests_htmlrequests庫的基礎上整合的html解析&數據篩選的功能!
          • 下面要為大家介紹的是requests_html模塊中的一些高級功能:自動渲染JS&智能分頁

          JS渲染

          • 我們在做爬蟲項目的時候會遇到網站的頁面是由js生成的情況!這個時候要么就是自己去一步一步地分析請求,要么就是使用selenium等第三方庫來進行渲染頁面,為了解決這個難題,requests_html模塊中引進了pyppeteer,使用pyppeteer可以像使用selenium一樣實現網站的完整加載!而且pyppeteer是一個異步模塊!效率會更高!
          • requests_html模塊在HTML對象的基礎上使用render()方法重新加載js頁面
          • 注意:在第一次使用render()的時候,系統在用戶目錄(默認是~/.pyppeteer/)中下載一個chromium。下載過程只在第一次執行,以后就可以直接使用chromium來執行任務了。在沒有科學上網的環境下可能下載速度有點慢,請耐心等待...
          • 下面是一個官方示例
          >>> r = session.get('http://python-requests.org/')
          
          >>> r.html.render()
          [W:pyppeteer.chromium_downloader] start chromium download.
          Download may take a few minutes.
          [W:pyppeteer.chromium_downloader] chromium download done.
          [W:pyppeteer.chromium_downloader] chromium extracted to: C:\Users\xxxx\.pyppeteer\local-chromium\571375
          >>> r.html.search('Python 2 will retire in only {months} months!')['months']
          '<time>25</time>'
          
          • requests_html模塊在HTML對象的基礎上使用render()方法重新加載js頁面,它有以下幾個參數:
          def render(self, retries: int = 8, script: str = None, wait: float = 0.2, scrolldown=False, sleep: int = 0, reload: bool = True, timeout: Union[float, int] = 8.0, keep_page: bool = False):
          - retries: 加載頁面失敗的次數
          - script: 頁面上需要執行的JS腳本(可選)
          - wait: 加載頁面前等待的時間(秒),防止超時(可選)
          - scrolldown: 頁面向下滾動的次數(整數)
          - sleep: 在頁面初次渲染之后的等待時間
          - reload: 如果為False,那么頁面不會從瀏覽器中加載,而是從內存中加載,只有設置為True才會在瀏覽器中渲染JS
          - keep_page: 如果為True,允許您使用 r.html.page 訪問瀏覽器頁面
          
          • requests_html還支持異步渲染JS[^1]

          自動翻頁(不太好用)

          • 很多網站會出現翻頁的情況,requests_html模塊的HTML對象中提供了一個next()方法來實現自動翻頁!
          • requests_html模塊在HTML對象的基礎上使用next()方法來實現自動翻頁!它有以下幾個參數:
          def next(self, fetch: bool = False, next_symbol: _NextSymbol = DEFAULT_NEXT_SYMBOL) -> _Next:
          fetch: 一個布爾型參數,默認為False:直接返回下一頁的 url地址;
                 如果設置為True:則直接返回下一頁的 HTML對象
          
          • 這個方法我自己測試了一下,只有一些特定的網站才能實現這個功能,requests_html在的源碼中可以看到,作者通過搜索包含'next', 'more', 'older'字段的a標簽(因為一般情況下我們的下一頁url就是在a標簽下的href屬性中),所以只有滿足了他的條件才會實現這個功能(也就是說HTML頁面不按照這個套路它就無法實現這個功能!),下面是部分源碼
          DEFAULT_NEXT_SYMBOL = ['next', 'more', 'older']
          # next()方法
              def next(self, fetch: bool = False, next_symbol: _NextSymbol = DEFAULT_NEXT_SYMBOL) -> _Next:
                  """Attempts to find the next page, if there is one. If ``fetch``
                  is ``True`` (default), returns :class:`HTML <HTML>` object of
                  next page. If ``fetch`` is ``False``, simply returns the next URL.
          
                  """
          
                  def get_next():
                      candidates = self.find('a', containing=next_symbol) # 尋找 包含字段'next', 'more', 'older' 的a標簽
          
          • 這里我就不做舉例了,大家可以自行去嘗試!

          異步

          • requests_html中還支持了異步功能
          • requests_html是使用了asynico來封裝了一些異步操作,所以這里的一些操作會用到asynico庫相關的一些知識,如果您還不太了解,請自行學習!

          異步渲染JS

          • 前面我們介紹了使用render()方法渲染JS,其實它還支持異步渲染
          • 一般異步渲染使用在我們有多個頁面需要進行渲染的情況下,因為只要在多任務的時候才能體現出異步的高效率,它有以下幾個參數:
          def __init__(self, loop=None, workers=None, mock_browser: bool = True, *args, **kwargs):
          loop: 使用的Asyncio循環。
          workers: 用于執行異步調用的線程數量。如果不傳遞,它將默認為電腦處理器數量乘以5
          
          • 更多的異步使用方法請參考asyncio庫的使用方法,下面是一個官方示例
          >>> async def get_pyclock():
          ...     r = await asession.get('https://pythonclock.org/')
          ...     await r.html.arender()
          ...     return r
          ...
          >>> results = asession.run(get_pyclock, get_pyclock, get_pyclock) # 這里作者將同一個頁面使用異步方式進行了3次渲染,但是實際上使用的時間并不是平時的3倍!可能只是比平時渲染一個頁面多花了一點時間而已!這就是異步的好處!
          
          • 注意:results是一個列表

          異步傳參

          • 這里是后面加的內容,因為我突然想到有時候我們的函數有可能是帶參數的,那么這個時候我們可以使用lambda來進行傳參,看下面示例
          #!/usr/bin/env python
          # -*- encoding: utf-8 -*-                            
          # @Author     : xiao qiang
          # @WeChat     : xiaoqiangclub                              
          # @Software   : PyCharm      
          # @File       : test002.py
          # @Time       : 2021/5/30 19:48
          from requests_html import AsyncHTMLSession
          
          aSession = AsyncHTMLSession()
          
          
          async def test(tt, yy):
              r = await aSession.get('https://www.baidu.com/')
              await r.html.arender()
              print('-{}-{}-'.format(tt, yy))
              return r
          
          
          ret1 = aSession.run(lambda: test('1', 'a'))
          ret2 = aSession.run(lambda: test('2', 'b'))
          ret3 = aSession.run(lambda: test('3', 'c'))
          print(ret1)
          print(ret2)
          print(ret3)
          
          • 注意:這里ret1/ret2/ret3都是列表
          • 運行結果
          • 上面的示例還可以這樣寫

          #!/usr/bin/env python
          # -*- encoding: utf-8 -*-
          # @Author : xiao qiang
          # @WeChat : xiaoqiangclub
          # @Software : PyCharm
          # @File : test002.py
          # @Time : 2021/5/30 19:48
          from requests_html import AsyncHTMLSession
          aSession=AsyncHTMLSession()
          async def test(tt, yy):
          r=await aSession.get('https://www.baidu.com/')
          await r.html.arender()
          print('-{}-{}-'.format(tt, yy))
          return r
          # ret1=aSession.run(lambda: test('1', 'a'))
          # ret2=aSession.run(lambda: test('2', 'b'))
          # ret3=aSession.run(lambda: test('3', 'c'))
          # print(ret1)
          # print(ret2)
          # print(ret3)
          #
          test_dict={
          '1': 'a',
          '2': 'b',
          '3': 'c'
          }
          tasks=[lambda i=i, y=y: test(i, y) for i, y in
          test_dict.items()]
          # lambda傳參誤區參考文章:https://www.jianshu.com/p/58ebd1618556
          ret=aSession.run(*tasks)
          # 注意前面有個 *,不可少!# 參考文章:https://www.jianshu.com/p/58ebd1618556
          print(ret)

          • 這里在使用lambda傳參的時候可能會出現一個錯誤,可以參考文章解決!
          • 運行結果

          異步發送請求

          • 我們在做爬蟲的時候,特別是大型爬蟲的時候,需要對很多頁面進行操作,或者說是需要發送很多請求,也就是需要進行很多IO操作。所以,使用異步發送請求能顯著地提升我們的爬蟲效率!
          • requests_html模塊中,設置了一個AsyncHTMLSession類來實現發送異步請求
          • ,下面是一個官方示例
          >>> from requests_html import AsyncHTMLSession
          >>> asession = AsyncHTMLSession()
          >>> async def get_pythonorg():
          ...     r = await asession.get('https://python.org/')
          ...     return r
          ...
          >>> async def get_reddit():
          ...    r = await asession.get('https://reddit.com/')
          ...    return r
          ...
          >>> async def get_google():
          ...    r = await asession.get('https://google.com/')
          ...    return r
          ...
          >>> results = asession.run(get_pythonorg, get_reddit, get_google)
          >>> results # check the requests all returned a 200 (success) code
          [<Response [200]>, <Response [200]>, <Response [200]>]
          >>> # Each item in the results list is a response object and can be interacted with as such
          >>> for result in results:
          ...     print(result.html.url)
          ...
          https://www.python.org/
          https://www.google.com/
          https://www.reddit.com/
          
          • 上面的示例用到了asynico庫中一些相關的知識,如果您還不太了解,請自行學習!

          總結

          • requests_html模塊requests庫的基礎上封裝了頁面解析數據清理的功能,并且添加了對當前比較流行的異步操作,讓我們在做爬蟲項目(一般項目)的時候無需再去使用多個第三方模塊來實現功能,幾乎是提供了一站式的服務!
          • 所以Python寫爬蟲使用requests_html就對了!(當然大項目還是首選scrapy,個人愚見!)
          • 更多內容

          視頻講解源碼

          from requests_html import HTMLSession, HTML, AsyncHTMLSession
          from pprint import pprint
          
          
          class DouBanTest:
              def __init__(self):
                  self.start_url = 'https://movie.douban.com/chart'  # 豆瓣電影排行榜url
                  self.js_url = 'https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'
                  self.session = HTMLSession()  # 實例化session
                  self.aSession = AsyncHTMLSession()  # 實例化異步session
                  self.headers = {
                      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
                  }
          
              def get_response(self, url):
                  """獲取響應,并返回requests_html中的HTML對象"""
                  r = self.session.get(url, headers=self.headers)
                  # print(r)
          
                  return r.html
          
              # 快速獲取頁面中的url
              def fast_get_urls(self):
                  """快速獲取頁面中的url"""
                  html = self.get_response(self.start_url)
          
                  # HTML的 links屬性 可以快速獲取到頁面中 a標簽中的href屬性
                  urls = html.links
                  # pprint(urls)
          
                  # HTML的 absolute_links屬性 可以快速獲取到頁面中 a標簽中的href屬性,并返回絕對url地址
          
                  absolute_urls = html.absolute_links
                  pprint(absolute_urls)
          
              # 清洗數據(提取數據)
              def get_data_by_xpath(self):
                  """使用xpath獲取數據"""
                  html = self.get_response(self.start_url)
                  a_list = html.xpath('//table//div/a')
                  # pprint(a_list)
          
                  # 提取它的標題和url
                  movies_info = dict()
                  for a in a_list:
                      title = a.text  # 獲取標題(文本)
                      # print(title)
                      movie_url = a.attrs.get('href')  # 使用 attrs 來解析element元素,并獲得一個字典
                      # print(movie_url)
                      # print('-----')
                      movies_info[title] = movie_url
          
                  pprint(movies_info)
          
              # 清洗數據(提取數據)
              def get_data_by_css(self):
                  """使用css獲取數據"""
                  html = self.get_response(self.start_url)
                  a_list = html.find('tr[class="item"] div a')  # 參考 css選擇器 語法
                  # pprint(a_list)
          
                  # 提取它的標題和url
                  movies_info = dict()
                  for a in a_list:
                      title = a.text  # 獲取標題(文本)
                      # print(title)
                      movie_url = a.attrs.get('href')  # 使用 attrs 來解析element元素,并獲得一個字典
                      # print(movie_url)
                      # print('-----')
                      movies_info[title] = movie_url
          
                  pprint(movies_info)
          
              # 清洗數據(提取數據)
              def get_data_by_re(self):
                  """使用css獲取數據"""
                  html = self.get_response(self.start_url)
          
                  # search() 獲取第一條匹配的數據
                  # first_url = html.search('a href="{}"')  # 參數可以參考正則,獲取第一條匹配的數據
                  # pprint(first_url)
          
                  # search_all() 獲取所有滿足條件的數據列表
                  # url_list = html.search_all('a h{}f="{}"')
                  url_list = html.search_all('a h{title}f="{url}"')  # 對取值方式進行命名,返回一個列表
          
                  # pprint(url_list)
                  #
                  # 提取數據
                  for url in url_list:
                      print(url)
                      print(url['title'])  # 使用 result[name] 進行取值
                      print(url['url'])
                      # print(url[0])
                      # print(url[1])
                      print('----------')
          
              # HTML類
              def use_HTML(self):
                  """使用HTML模塊處理文檔"""
                  html_str = '<a class="nbg" href="https://movie.douban.com/subject/3099221/" title="活死人軍團">'
                  html = HTML(html=html_str)
          
                  # links
                  print(html.links)
          
                  # search()
                  print(html.search('href="{}"'))
          
              # 加載JS頁面
              def load_js(self):
                  html = self.get_response(self.js_url)
          
                  # 使用一個 render()方法 來加載js(實際上使用這個pyppeteer)
                  # html.render(wait=3)  # js加載
                  print(html.html)
          
              async def send_requests_ues_async(self, url):
                  """發送異步請求"""
          
                  """獲取響應,并返回requests_html中的HTML對象"""
                  r = await self.aSession.get(url, headers=self.headers)
                  # print(r)
          
                  return r.html
          
              def get_response_by_async(self):
                  url_list = [
                      'https://www.baidu.com',
                      'https://www.qq.com',
                      'https://www.163.com',
                  ]
                  tasks = [lambda url=url: self.send_requests_ues_async(url) for url in url_list]
                  ret = self.aSession.run(*tasks)  # 返回的是一個HTML對象列表
                  # print(ret)
                  # print(ret[0].html)
                  for html in ret:
                      print(html)
          
              async def load_js_use_async(self, url):
                  """異步加載js"""
                  html = await self.send_requests_ues_async(url)
          
                  # 異步加載js
                  await html.arender()
          
                  return html
          
              def get_js_by_async(self):
                  # ret = self.aSession.run(self.load_js_use_async)
                  #
                  # print(ret[0].html)
          
                  url_list = [
                      'https://www.baidu.com',
                      'https://www.qq.com',
                      'https://www.163.com',
                  ]
                  tasks = [lambda url=url: self.load_js_use_async(url) for url in url_list]
                  ret = self.aSession.run(*tasks)  # 返回的是一個HTML對象列表
                  # print(ret)
                  # print(ret[0].html)
                  for html in ret:
                      print(html)
          
          
          if __name__ == '__main__':
              test = DouBanTest()
              # test.get_data_by_xpath()
              # test.get_data_by_css()
              # test.fast_get_urls()
              # test.get_data_by_re()
              # test.use_HTML()
              # test.load_js()
              # test.get_response_by_async()
              test.get_js_by_async()
          
          

          【本文由 "XiaoqiangClub" 發布,2021年6月17日】

          所以放著《信號》遲遲沒有安利,是因為這個劇的片源一直不穩定,這么緊湊燒腦欲罷不能的神劇,追到一半后面的資源看不了了的那種煎熬感,簡直是抓心撓肝。

          現在騰訊視頻居然火速出了高質量正版了,終于是安利的最佳時刻了!!

          友情提示:對《信號》來說,任何不一口氣從頭追到尾的看劇方式都是耍!流!氓!

          (所以我們周五晚上才發這個,周末刷起來吧,hiahia)

          《信號》引起我的注意的時候還只有一千多人打分,現在評價人數翻了十倍,分數一直堅挺保持在9.2,領先同期的《太陽的后裔》一個身位都不止。

          又是一部看上去沒什么大熟臉明星卡司,但是一但陷進去就無法掙脫的劇集,三大主演李帝勛、金惠秀、趙震雄都是演技派,我不會告訴你現在最右邊的微胖滄桑大叔是我的夢中情人:

          前有1988的一眾丑男俘獲萬千少女心,后有信號里臉輸配角一萬倍的兩大糙漢靠人設帥炸全宇宙,tvN你這么肆意操控我們的審美是不是很爽?!

          《信號》的好看,很難用一兩句話就說清楚。

          雖然就是一部16集每集1小時左右的正常體量的韓劇而已,但是相比以往幾乎所有在中國大紅過的韓劇來說,它都豐富得多——形式感上有刑偵、懸疑、穿越;大格局包含了個人選擇、家國命運、蝴蝶效應;感情上有愛情、親情、對小人物的悲憫......

          一部劇包含這么多元素不難,難的是隨著劇情的鋪墊強化,每一部分都漸入佳境,完成得很圓滿:用了平行時空的設定但是沒有明顯的爛尾和bug,出場人物很多但是每個都立體豐滿。16集看下來幾乎沒有一個廢鏡頭,沒有一處閑筆,每一集都是電影級別的質感。

          唯一的缺點是第一集的前半個小時有點難進入,看起來不明就里,實在是因為編劇腦洞太大,開篇要交代的東西太多。

          但是請答應我,一定要堅持住!

          熬過這半小時,看懂了基本設定,你會被一股神秘力量帶領著一集一集刷下去根本停不下來!而且開篇的每一個細節都要看仔細,看到后面會無數次想用小岳岳臉驚呼,我的天吶,原來前面早有暗示!

          那種跟著編劇把記憶里星星點點的小懷疑一點點串聯成一張網,在某個瞬間一下想通謎底的愉悅感,酣暢淋漓。

          為了能方便說清楚《信號》好看在哪,我要把《信號》拆解成三個部分:

          首先是破案。

          《信號》最主要的一條線索,是年輕刑警樸海英撿到一個對講機,從而和十多年前的前輩李材韓開始跨越時空的聯系,兩個人聯手一起解決多年來懸而未決的案件。

          這些案件每個都不簡單。

          比如說開篇引入的「金允貞誘拐案」:

          樸海英小時候無意中目睹了同學金允貞被一個打扮艷麗的女人誘拐。很快這件涉及女學生的綁架案變成全社會的焦點,所有已知的證據都指向一個年輕男子,幼小的樸海英到警察局提供線索,但是一個小屁孩說的話根本沒人在意。

          因為警察被高智商罪犯戲耍,追查方向一開始就錯了,「金允貞誘拐案」變成一樁懸案,直接懸了15年。

          眼看訴訟時效還剩下三天,警方顯然依舊沒有(也怕麻煩不太想有)什么進展。

          15年后,樸海英警校畢業,但是因為對警察的不信任,變成了一個利用刑偵能力追蹤明星賣緋聞的混子。在一次調查明星被警察盯上帶回警局調查的時候,他在警察局門口意外撿到一個沒有電池的老式對講機。

          對講機里短暫的信號,告訴了他關于「金允貞誘拐案」的一個關鍵線索,勾起了他十多年前的回憶。

          他利用這個線索和自己強大的心理分析能力,很快鎖定了真正的犯罪嫌疑的人特征,但是這時候距離「金允貞誘拐案」的訴訟時效中止,已經只剩下一個半小時。

          罪犯通過新聞知道了警察追查的進展,但是心理極度自信的她決定繼續戲耍警察——畢竟一個半小時之后,訴訟時效一過,就是知道她就是真兇,也沒有人能動她一分一毫了。

          真正緊張的地方從這里開始,這一個半小時簡直過得比一年還漫長:

          知道了犯罪分子的特征,但是被她誤導追查了錯誤的人→→意識到被誤導之后,真正的罪犯已經藏身→→找到她的藏身地點把她羈押,又沒等到化驗結果出來用證據蓋章她就是罪犯→→試圖在最后幾分鐘用心理戰攻破她的防線讓她認罪,但是她偏偏軟硬不吃比警察想得更強大。

          還剩幾分鐘了啊!

          審訊室外面,是金允貞母親蒼老的臉:

          15年來她只能每天站在路口舉個牌子,呼吁大家不要忘了她女兒。

          是韓國全社會對15年毫無進展的案件的關注。

          是來自警察局領導的仇恨臉:馬上就要過訴訟時效的案子讓它安靜過去就行了干嘛要鬧出這么大的幺蛾子打我的臉!!!

          千鈞一發,按照以往我們熟悉的“最后一分鐘營救”的經典套路,警察總是要在時間耗盡前最后一秒鐘把罪犯繩之以法的,但這次并沒有——

          警察敗了,束手無策。

          編劇就是要觀眾和內心有責任感的主人公一起承受這種挫敗感。只有這樣,大家才能對「訴訟時效」制度給被害人家屬帶來的傷害有那么幾分感同身受。

          這正是《信號》的格局所在。

          當然這還不是這個案件的最終結果,后面還有反轉,我就不劇透了。

          韓國的影視劇多次對「訴訟時效」制度是否合理做出過探討。《信號》這次重提這個話題,也有特別的意義——在真實的韓國社會,原本殺人罪的訴訟時效是15年,2007年延長為25年。2015年7月24日,韓國國會通過刑事訴訟法修正案,正式廢除了殺人罪的公訴時效。

          一個又一個電影電視劇不遺余力參與社會議題,引起民眾的關心和思考,積累起輿論的力量就可以改變國家。那種和主角一起經歷一場高潮迭起絕處逢生的偵破過程,最后改變了法律制的體驗,真的好燃!

          接下來《信號》里每一個案件都無一例外有社會原型,并且現實意義被挖掘的越來越深。

          京畿南部連環殺人案的原型是華城連環殺人案,在現實里至今是懸案。電影《殺人回憶》和tvN早先的電視劇《岬童夷》都改編自這個案件。《信號》是tvn第二次利用這個題材——

          1986年至1991年間,韓國京畿道華城市太安鎮一帶,有10名女性依次被用殘忍的手法殺害,殺人犯始終未被捕,最終成為未解決的殺人事件。

          這起案子是韓國人心中的一根刺,殺人手法惡劣,投入警力眾多,連犯罪者的畫像都有,但就是抓不到人。這根刺不斷被翻出來演繹,一次又一次提醒國人正義還沒有來到,我們還沒有放棄。

          如果說前兩個案子還主要集中在對社會制度的討論,那么后面這幾個就已經開始不遺余力地對公務階層開黑了。

          第三個案子申汝珍綁架案,犯罪者和被綁架的女生都是一次大橋坍塌事故的受害者。這個事故的原型是圣水大橋坍塌事件——一座剛建好的大橋因為施工腐敗轟然倒塌。

          《信號》里,坍塌事故有兩個受害女學生,一個因為家里的權勢得救,另一個只能在父親的呼喊聲里死去。

          在這個案子里,鏡頭帶過一下大橋坍塌事故的紀念碑,寫著永遠銘記遇難者:

          諷刺得是,就在這座紀念碑前,15年過去,兩個受害者家庭依舊因為當初誰應該獲救而糾纏,衍生出綁架案甚至還有人因此喪命。

          對受害者來說,家人去世了就是去世了,悲劇從來沒有過去。但是對于參與貪腐的官員和生意人,一塊紀念碑就足以遮掩一切。

          看到這兒,我對《信號》針砭時弊的尺度已經深深拜服了。

          接下來的大盜案件、仁州女高中生案件無一例外涉及權貴階層和警察系統互相勾結,黑幕深不見底。

          而且,申汝珍綁架案的犯罪者是大盜案件的受害者,仁州女高中生案件更是把所有主角全部串聯在了一起。

          一環一環緊緊相扣,因果相關,16集連著看下來沒有一絲喘息的時間。

          ------------------

          接下來說平行時空的設定。

          《信號》緊湊的懸念,一部分來自于涉及的案件本身之復雜,另一部分是靠對講機實現的跨越時空的聯系。

          這個設定已經不新鮮了,美劇、港劇都有先例。

          《信號》好在沒有讓這個對講機成為兩個主角的外掛,從此所向披靡,而是讓它帶來很多禍患:

          身處過去的李材韓依靠幾十年后的信息源,改變著過去,但是過去被改變,現在也隨之改變。這就像潘多拉的魔盒,一旦開始,沒人知道會發生什么。

          在京畿南部連環殺人案里,他們合力救下了一個被害者,但是這個舉動15年后卻造成另外一個無辜的人被殺死。所以利用對講機救人是對是錯?

          即便連通古今,李材韓和樸海英都不是全知,樸海英被誤導提供給李材韓錯誤的信息,造成無辜的人被冤枉,15年后釀成了更大的慘劇。誰該為這樣的慘劇負責?

          所以他們倆都曾經動搖過,一度斷了聯系。

          但是最終,還是選擇直面問題,聯手對抗。

          因為只有堅決對抗到絆倒黑幕源頭的人,把真正的錯誤糾正了,才能徹底改變過去,繼而改變未來。

          對講機的存在,也一度把李材韓推到悲劇人物的境地。

          查案查到最后,樸海英知道李材韓會在查案過程里死去。但就是這次死前,他聯通了和樸海英聯絡的對講機,給樸海英提供了第一個線索。

          樸海英該阻止李材韓,保護他不被殺死嗎?

          如果阻止了過去里的他死去,現在的他就能保全嗎?

          他查了一半的案子怎么辦,就此放棄了嗎?

          這些懸念和兩難的抉擇推動劇情,在兩個男主角的關系之間形成巨大的張力。

          ------------------

          至于感情線,曾經被《請回答1988》的觸動人,就一定會感受到《信號》的用心。

          韓劇編劇的可怕之處在于,對于人性的細節的洞察。給每個人物,哪怕是支線里的小人物,都安排了很多前因后果的細節,慢慢鋪陳,拼湊成一個個立體又可愛的普通人,一點點擊中你。

          比如硬漢刑警李材韓,他不是高大全的英雄,他也會哭,也會懷疑,有很多時候無能為力,看著自己的初戀女友在自己面前死去,明知道罪犯是誰又沒法抓捕......

          但是他永遠有正義感——真正的正義感,不是無知無畏,是明知道自己內心也有恐懼,知道自己可能神仙危險,但是依然選擇忠于內心的信念:

          有同理心,每個受害者,對他來說都不是幾張照片幾個關鍵詞,而是一個個活生生的人:

          不放棄,哪怕用一己之力對抗全世界,也不放棄:

          就是這么一個平凡到就在你我身邊的糙漢,但誰又能說他不是英雄呢?每次他孤身一人出發去查案的時候,雖然就穿個破夾克邋邋遢遢的,但是正義和勇氣的光環讓他帥炸了!

          李材韓的初戀女友是一個案件的受害者,受害之前,買了兩張電影票本打算邀請李材韓一起看。

          在初戀女友遇害之后,李材韓獨自一個人來看電影,一個喜劇片,只有他身邊的座位空著,周圍全是笑聲,沒人懂他為什么哭成傻逼:

          過了很多年之后,暗戀他的女刑警車秀賢在圣誕節請他看電影,他笑笑說:“我從來不看電影的。”

          天哪!這云淡風輕的一句話,對觀眾來說簡直是暴擊!他從來沒有放下過心里的傷痛,一個看起來不解風情的硬漢心里那點柔情,多么動人啊!

          還有女一號車秀賢,一路從一個什么都不知道的傻妹:

          眼神里都是純真:

          李材韓受傷,女漢子車秀賢在救護車上笨拙地哭著和李材韓表白,看得我又哭又笑,少女心炸裂:

          后來他進化成干練的女刑警隊長,一個人扛下所有壓力,所謂愛一個人就是把自己活成他,這時候的車秀賢,已經是另一個李材韓。

          追尋李材韓蹤跡的十五年,沒人知道她內心經歷了多少失望、難過、寂寞,直到發現李材韓的尸骨,才終于哭出來:

          這里要表白飾演車秀賢的金惠秀,她已經46歲了,演出女主角二十多歲的少女眼神依然毫無違和感,不愧是韓國頂級電影咖。

          之前提到過每個配角都比兩個男主角帥不是瞎說,有圖為證

          《信號》里的殺人犯長這樣:

          跋扈富二代長這樣:

          男主角被人冤枉入獄的哥哥長這樣:

          另外還有滿嘴牢騷關鍵時刻覺不掉鏈子的逗逼同事:

          亦正亦邪背負著一身秘密,最后變成關鍵性線索人物的科長:

          每個人物身上都背負著好幾重反轉,再說下去就沒完了,所有懸念等你看劇的時候慢慢發現!

          總之,《信號》刑偵線、平行時空線、感情線,這三條線交織,看片體驗就是:緊張、害怕、搞笑又感動。

          同樣的題材,給美劇可能拍成《24小時》,給港劇會拍成《隔世追兇》,國產劇這不能拍那拍不出來的,最后變成警察們談戀愛,韓國人就綜合各家之長,既有美劇的多線敘事,又有港劇的職場氛圍,還不失韓劇本身的人情味,拍出一個可看性、深度、情感都兼顧得很好的劇。

          當《信號》以口碑逆襲,在劇迷內部造成轟動效應之后,騰訊視頻立刻就跟進買了正版全集,足見其實力。

          如果說《太陽的后裔》還只是偶像劇領域的小超越,《信號》就是從創作環境到編劇能力、演員表演水準、對待觀眾的態度的全面碾壓。

          在整個影視產業,我們都被甩得太遠了。

          正版全集《信號》觀看傳送門

          http://film.qq.com/cover/v/vkf8hhfj7uunkg6.html#rd


          主站蜘蛛池模板: 久久久无码精品人妻一区| 福利一区在线视频| 日韩精品一区二区三区不卡 | 视频一区二区三区在线观看| 视频在线一区二区| 精品人妻少妇一区二区三区不卡 | 97精品一区二区视频在线观看| 狠狠做深爱婷婷综合一区 | 高清无码一区二区在线观看吞精| 男人的天堂av亚洲一区2区| 亚洲日韩国产一区二区三区在线| 日本道免费精品一区二区| 精品视频一区二区三区| 波多野结衣一区二区三区88 | 日本内射精品一区二区视频 | 亚洲av乱码一区二区三区香蕉| 人妻无码一区二区不卡无码av| 麻豆AV一区二区三区久久| 精品无码成人片一区二区98| 一本大道在线无码一区| 视频一区视频二区在线观看| 一区二区三区高清在线| 武侠古典一区二区三区中文| 亚洲日韩国产一区二区三区在线 | 无码人妻精品一区二区三区99仓本 | 日韩人妻一区二区三区免费| 韩国精品一区视频在线播放| 精品无码综合一区二区三区| 亚洲免费视频一区二区三区| 91在线视频一区| 国产一区二区视频免费| 99国产精品一区二区| 无码精品一区二区三区| 美女视频在线一区二区三区| 亚洲高清美女一区二区三区| 精品一区二区三区免费观看| 久久久久人妻精品一区蜜桃 | 国产精品日本一区二区不卡视频 | 精品乱码一区二区三区在线| 国产AV一区二区三区传媒| 日韩久久精品一区二区三区|