<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 Python 爬取 QQ 空間說說和相冊

          共 10372字,需瀏覽 21分鐘

           ·

          2021-05-11 19:53

          點擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進行關(guān)注

          回復(fù)“書籍”即可獲贈Python從入門到進階共10本電子書

          君不見走馬川行雪海邊,平沙莽莽黃入天。


          文 | 某某白米飯

          來源:Python 技術(shù)「ID: pythonall」

          QQ 空間在 2005 年被騰訊開發(fā),已經(jīng)經(jīng)歷了 15 個年頭,在還沒有微信的年代,看網(wǎng)友發(fā)表的心情、心事、照片大多都在 QQ 空間的里。它承載了80、90 后的大量青春,下面我們一起用 selenium 模塊導(dǎo)出說說和相冊回憶青春吧


          安裝 selenium

          selenium 是一個在瀏覽器中運行,以模擬用戶操作瀏覽器的方式獲取網(wǎng)頁源碼,使用 pip 安裝 selenium 模塊

          pip install selenium

          查看 chrome 瀏覽器版本并下載 對應(yīng)的 chrome 瀏覽器驅(qū)動

          http://npm.taobao.org/mirrors/chromedriver 網(wǎng)址中找到相同版本的 chrome 驅(qū)動,并放在 python 程序運行的同一個文件夾中

          登陸

          按 F12 檢擦網(wǎng)頁源代碼,找到登錄和密碼的文本框,如下圖所示

          def login(login_qq,password, business_qq):
              '''
              登陸
              :param login_qq: 登陸用的QQ
              :param password: 登陸的QQ密碼
              :param business_qq: 業(yè)務(wù)QQ
              :return: driver
              '''

              driver = webdriver.Chrome()

              driver.get('https://user.qzone.qq.com/{}/311'.format(business_qq))  # URL
              driver.implicitly_wait(10)  # 隱示等待,為了等待充分加載好網(wǎng)址
              driver.find_element_by_id('login_div')
              driver.switch_to.frame('login_frame')  # 切到輸入賬號密碼的frame
              driver.find_element_by_id('switcher_plogin').click()  ##點擊‘賬號密碼登錄’
              driver.find_element_by_id('u').clear()  ##清空賬號欄
              driver.find_element_by_id('u').send_keys(login_qq)  # 輸入賬號
              driver.find_element_by_id('p').clear()  # 清空密碼欄
              driver.find_element_by_id('p').send_keys(password)  # 輸入密碼
              driver.find_element_by_id('login_button').click()  # 點擊‘登錄’
              driver.switch_to.default_content()

              driver.implicitly_wait(10)
              time.sleep(5)

              try:
                  driver.find_element_by_id('QM_OwnerInfo_Icon')
                  return driver
              except:
                  print('不能訪問' + business_qq)
                  return None

          說說

          登錄 QQ 后默認(rèn)的頁面就在說說的界面,顯示一頁的說說是滾動加載的,必須要多次下拉滾動條后才能獲取到該頁所有的說說,然后用 BeautifulSoup 模塊構(gòu)建對象解析頁面,下圖是放說說的 iframe

          def get_shuoshuo(driver):
              
              page = 1
              while True:
                  # 下拉滾動條
                  for j in range(15):
                      driver.execute_script("window.scrollBy(0,5000)")
                      time.sleep(2)

                  # 切換 frame
                  driver.switch_to.frame('app_canvas_frame')
                  # 構(gòu)建 BeautifulSoup 對象
                  bs = BeautifulSoup(driver.page_source.encode('GBK''ignore').decode('gbk'))
                  # 找到頁面上的所有說說
                  pres = bs.find_all('pre', class_='content')

                  for pre in pres:
                      shuoshuo = pre.text
                      tx = pre.parent.parent.find('a', class_="c_tx c_tx3 goDetail")['title']
                      print(tx + ":" + shuoshuo)

                  # 頁數(shù)判斷
                  page = page + 1
                  maxPage = bs.find('a', title='末頁').text

                  if int(maxPage) < page:
                      break

                  driver.find_element_by_link_text(u'下一頁').click()
                  # 回到主文檔
                  driver.switch_to.default_content()
                  # 等待頁面加載
                  time.sleep(3)

          相冊

          下載相冊里面的照片需要 selenium 模塊模擬鼠標(biāo)一步步點擊頁面,先點擊上方的相冊按鈕,進去就是多個相冊的列表,下圖是單個相冊的超鏈接

          在單個相冊中點擊照片,界面如下圖

          def get_photo(driver):
              
              # 照片下載路徑
              photo_path = "C:/Users/xxx/Desktop/photo/{}/{}.jpg"
              
              # 相冊索引
              photoIndex = 1

              while True:
                  # 回到主文檔
                  driver.switch_to.default_content()
                  # driver.switch_to.parent_frame()
                  # 點擊頭部的相冊按鈕
                  driver.find_element_by_xpath('//*[@id="menuContainer"]/div/ul/li[3]/a').click()
                  #等待加載
                  driver.implicitly_wait(10)
                  time.sleep(3)
                  # 切換 frame
                  driver.switch_to.frame('app_canvas_frame')
                  # 各個相冊的超鏈接
                  a = driver.find_elements_by_class_name('album-cover')
                  # 單個相冊
                  a[photoIndex].click()

                  driver.implicitly_wait(10)
                  time.sleep(3)
                  # 相冊的第一張圖
                  p = driver.find_elements_by_class_name('item-cover')[0]
                  p.click()
                  time.sleep(3)

                  # 相冊大圖在父frame,切換到父frame
                  driver.switch_to.parent_frame()
                  # 循環(huán)相冊中的照片
                  while True:
                      # 照片url地址和名稱
                      img = driver.find_element_by_id('js-img-disp')
                      src = img.get_attribute('src').replace('&t=5''')
                      name = driver.find_element_by_id("js-photo-name").text

                      # 下載
                      urlretrieve(src, photo_path.format(qq, name))

                      # 取下面的 當(dāng)前照片張數(shù)/總照片數(shù)量
                      counts = driver.find_element_by_xpath('//*[@id="js-ctn-infoBar"]/div/div[1]/span').text

                      counts = counts.split('/')
                      # 最后一張的時候退出照片瀏覽
                      if int(counts[0]) == int(counts[1]):
                          # 右上角的 X 按鈕
                          driver.find_element_by_xpath('//*[@id="js-viewer-main"]/div[1]/a').click()
                          break
                      # 點擊 下一張,網(wǎng)頁加載慢,所以10次加載
                      for i in (110):
                          if driver.find_element_by_id('js-btn-nextPhoto'):
                              n = driver.find_element_by_id('js-btn-nextPhoto')
                              ActionChains(driver).click(n).perform()
                              break
                          else:
                              time.sleep(5)

                  # 相冊數(shù)量比較,是否下載了全部的相冊
                  photoIndex = photoIndex + 1
                  if len(a) <= photoIndex:
                      break

          示例結(jié)果

          總結(jié)

          大家在看十幾年前的說說和照片是不是感覺滿滿的黑歷史快要溢出屏幕了。時光荏苒、歲月如梭,愿一切安好。

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群

          萬水千山總是情,點個【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  学生妹内射片 | 国产精品福利视频导航 | 黄色永久网站 | 五月天操逼视频 | 日韩成人免费视频 |