p站图片爬取
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
样品图链: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)
点击查看代码
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)