【python&爬蟲】requests登錄豆瓣網並爬取“瀏覽發現”中的文章簡介和圖片

一.前言

爲了總結前面所學知識,今天隨便爬了一下豆瓣網。使用了requests+xpath,豆瓣網的爬取相對比較簡單,可將此網站作爲爬蟲的入門。

二.爬取需求

爬取每篇文章的用戶名,標題,文章簡介,圖片,點贊量和轉發量。
注意:標題和圖片有的文章沒有
在這裏插入圖片描述
在這裏插入圖片描述

三.說明

1.登錄豆瓣
在這裏插入圖片描述
2.文章的刷新,重複請求這個url即可實現文章的刷新,以下代碼只刷新了3次
在這裏插入圖片描述

四.代碼演示

# encoding=gbk
import requests
import json, os
from lxml import etree

url = "https://accounts.douban.com/j/mobile/login/basic"
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
}
# name和password是登錄豆瓣網的賬號的密碼
fromdata = {
    "name": "XXXXXXX",
    "password": "XXXXXXX"
}
# 將表單數據序列化
data = json.dumps(fromdata)
# 發送post請求 使用session建立持久會話
session = requests.session()
response1 = session.post(url=url, data=fromdata, headers=header)
# 新建一個文件夾用於存放豆瓣圖片
if not os.path.exists("./豆瓣數據"):
    os.mkdir("./豆瓣數據")
# 判斷是否請求成功
if response1.status_code == 200:
    count = 1
    # 爬取 3 頁數據
    while count <= 3:
        # 每次請求這個url都會刷新頁面內容
        response = session.get("https://www.douban.com/explore/", headers=header)
        # 使用etree繼續html
        html = etree.HTML(response.text)
        dicts = {}
        album = []
        items = html.xpath('//*[@id="gallery_main_frame"]/div[@class="item"]')
        if not os.path.exists(f"./豆瓣數據/第{count}頁數據"):
            os.mkdir(f"./豆瓣數據/第{count}頁數據")
        for item in items:
            # 獲取用戶名,文章簡介,標題,並將其轉換成字符串
            username = "".join(item.xpath('./div[@class="hd"]/div[@class="usr-pic"]/a[2]/text()'))\
                .encode("gbk","ignore").decode("gbk")
            # \表示本行代碼換行
            detail = "".join(item.xpath('./div[@class="bd"]/div/p[1]/text()')).strip()\
                .encode("gbk", "ignore").decode("gbk")
            titles = "".join(item.xpath('./div[@class="bd"]//div[@class="title"]/a/text()'))
            likes_forword = item.xpath('div[@class="actions"]//span/text()')
            likes = likes_forword[0] + "贊"
            forwords = likes_forword[1] + "轉發"
            # 將以上信息存入字典
            dicts["username"] = username
            dicts["titles"] = titles
            dicts["detail"] = detail
            dicts["likes"] = likes
            dicts["forwords"] = forwords
            # 獲取所有圖片鏈接,其中可能會有空列表
            photos_album = "".join(item.xpath('./div[@class="bd"]//div[@class="photos"]/a/@href'))
            dicts['photos'] = photos_album
            file = open(f"./豆瓣數據/第{count}頁數據/第{count}頁文本數據", "at").write(str(dicts) + "\n")
            # 篩選存在圖片鏈接的列表
            if len(photos_album) == 0:
                pass
            else:
                # 存入列表
                album.append(photos_album)

        # 下載圖片
        if not os.path.exists(f"./豆瓣數據/第{count}頁數據/第{count}頁圖片"):
            os.mkdir(f"./豆瓣數據/第{count}頁數據/第{count}頁圖片")
        for n in range(len(album) - 1):
            response = session.get(album[n], headers=header)
            file = open(f"./豆瓣數據/第{count}頁數據/第{count}頁圖片/{n + 1}.jpg", "wb").write(response.content)

        # 計數器自增,爬取下一頁
        count +=1

五.運行結果

已經生成了每頁數據文件夾,每頁圖片另外放在一個文件夾中
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章