一.前言
爲了總結前面所學知識,今天隨便爬了一下豆瓣網。使用了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
五.運行結果
已經生成了每頁數據文件夾,每頁圖片另外放在一個文件夾中