p站图片爬取

wukaz1 / 2024-02-18 / 原文

python爬虫主要思路:
1.选取目标网页:获得链接,观察源代码构成。
2.用request库的get方法取得源代码。其中header参数用于伪装正常浏览器发送请求,proxies用于设置访问代理,url为目标网站
3.获取text后用BS对象查找相应内容标签,要注意利用id,class名的特殊性。
4.获取到相应内容标签后需提取内容:正则或其他方法。如a标签中的href内容可用href=a['href]提取,img标签中的src可用src=a['src‘]提取,左边为变量名,可随意。
5.提取到链接后用with写入文件较稳定便捷,文本内容用文本形式w写入,图片内容用二进制形式wb写入

目标网站:
https://www.pixiv.net/users/911893/artworks
1.
若直接用request获取,只能得到部分内容,原因是该网站有登录保护。
所以采用selenium自动化打开网页获取源代码。鉴于edge太过流氓,不好回溯版本,以至于webdriver版本远落后于edge版本,故采用chrome。
自动化目的:登录pixiv主网站,再跳转至目标网站,获取源代码。

点击查看代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
import re
# 创建Chrome WebDriver实例
driver = webdriver.Chrome()

# 打开网页
driver.get("https://www.pixiv.net")

# 根据class名称找到登录链接元素
login_link = driver.find_element(By.CLASS_NAME, "signup-form__submit--login")

# 点击登录链接
login_link.click()
email_input = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'input[placeholder="邮箱地址或pixiv ID"]'))
)

# 输入自己的邮箱地址或Pixiv ID
email_input.send_keys("your_username")

# 找到密码输入框
password_input = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'input[placeholder="密码"]'))
)

# 输入密码
password_input.send_keys("your_password")
# 点击登录按钮
#创建了一个wait对象等待按钮可被点击
login_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, '.sc-bdnxRM.jvCTkj.sc-dlnjwi.klNrDe.sc-2o1uwj-10.jQmNGr.sc-2o1uwj-10.jQmNGr'))
)

login_button.click()

time.sleep(5)
#等待页面变为登录状态
driver.get("https://www.pixiv.net/users/911893/artworks")
time.sleep(5)
#预留时间获取页面源代码
page=driver.page_source
2. 获取页面源代码后要在源码中寻找图片链接。先需提取的是原图链接,而非展示页面中的样品链接(250*250px) 一种方法是现在目标页面找到所有图片的原图子链,再在子链页面提取原图链接。 另一种方法则是先提取样品链接,再根据变换规律用正则替换出原图链接。

样品图链:https://i.pximg.net/c/250x250_80_a2/img-master/img/2022/07/04/08/05/27/99492831_p0_square1200.jpg

原图链接:https://i.pximg.net/img-master/img/2022/07/04/08/05/27/99492831_p0_master1200.jpg

对比下知道,样品图链中的'c/250x250_80_a2/img-master'和'square'分别替换成'img-master'和'master'就可得到原图链接

点击查看代码
import re
url="https://i.pximg.net/c/250x250_80_a2/img-master/img/2022/07/04/08/05/27/99492831_p0_square1200.jpg"
#利用正则得到原图链接
new_url = re.sub(r'https://i.pximg.net/(.*?)/img/(.*?)p0(.*?)1200.jpg', r"https://i.pximg.net/img-master/img/\2p0_master1200.jpg", url)
3. 得到图片链接后便好办了,直接用request.get通过链接发送请求,获取content,再以二进制形式写入jpg文件便可储存图片。 但要注意的是p站图片设有防盗链接。图片链接在pixiv网站中可以直接显示,但在新建标签页中访问会报错404。这时需要将请求头header中的Referer设置为"www.pixiv.net"以绕过限制。
点击查看代码
import requests
from bs4 import BeautifulSoup

url="https://i.pximg.net/img-master/img/2022/07/04/08/05/27/99492831_p0_master1200.jpg"
header={'Referer':'https://www.pixiv.net'}
proxie = {
    'http': 'http://代理ip:端口',
    'https': 'http://代理ip:端口'
}
res=requests.get(url,headers=header,proxies=proxie)
with open("3.jpg",mode="wb")as f:
    f.write(res.content)

4. 国内访问pixiv需要FQ,所以在request请求中get的函数参数proxies需填入代理地址,否则,即便你开着vpn,网页能访问P站,使用request访问也会报错。