python 图片爬虫,如何利用python爬取图片
最近决定写一个p站的爬虫,但是在实际操作中确实遇到了一些新问题,通过解决有所收获。下面这篇文章主要介绍python爬虫实战项目中抓取pixiv图片的相关信息,有需要的朋友可以参考一下。
自从接触了python,就一直想着爬pixiv。因为之前梯子出了点问题,所以一直搁置。最近换梯子的时候迫不及待的想试试。
爬虫无非就是请求获取html页面,然后用现成的工具比如正则表达式或者beautifulsoup拦截我们想要的页面,pixiv也不例外。
首先,我们来实现模拟登录。虽然大多数情况下不需要我们实现模拟登录,但是如果你是会员之类的,登录和不登录网页是有区别的。思路是在登录的时候抓取包,抓住post请求,看看pixiv构建的post的数据表是什么格式。我们按照这个格式构建表单,然后调用post方法进行请求,然后保存到会话中。之后,我们可以访问相关页面,用session替换请求。
可以看到pixiv登录的网址如下,直接复制:
抓取数据包,找到提交数据的请求:
可以看出,表单数据主要是这些。经过几次尝试,我们在模拟时只需要建立password,pixiv_id,post_key加上一个return_to(第二个)。Pixiv_id是我们的账号,password是密码,return_to是刚填的,但是这个post_key是随机的。
但是我们也有办法。它是在我们每次访问登录页面时动态生成的,所以很简单。登录前,先爬页面再登录,找到postkey。
请参见下面的红圈:
可以直接定期抓取:
def get_postkey():
log in _ URL= https://accounts . pixiv . net/log in? return _ to=https://www . pixiv . net/lang=zhsource=PC view _ type=page
response=requests . get(URL=log in _ URL,headers=headers,verify=False)
html=response.text
#打印(html)
postkey=re . find all( pixiv account . postkey : (。*?)、 pixiv account . recaptchaenterpriseccheckboxsitekey 、html)
返回postkey[0]
然后我们可以构建数据包:
Pixiv_id=帐号 #您的Pixiv帐号
密码=xxxxx
#您的pixiv密码
return_to=https://www.pixiv.net/
post_key=get_postkey()
实例化一个session对象,然后post提交就可以完成模拟登录:
会话=请求。会话()
表单数据={
pixiv_id:pixiv_id,
密码 :密码,
return_to:return_to,
post_key:post_key
}
log in _ URL 1= https://accounts . pixiv . net/log in? return _ to=https://www . pixiv . net/lang=zhsource=PC view _ type=page
RES=session . post(URL=log in _ URL 1,headers=headers,data=form_data)
#目前为止,模拟登录成功。
这次模拟登录成功,接下来就是爬我们想要的图片了。以爬排行榜为例:
打开排行榜页面,将鼠标悬停在图片上,点击右键查看,可以找到对应的代码位置:
找到每张图片的相似结构,我们可以用BeautifulSoup找到节点,然后有规律的爬上我们想要的URL:
先找到包含每张图片各种信息的节点,按类名搜索,然后定期提取每个节点,提取对应图片的下载链接。不过需要注意的是,pixiv直接显示的图像来源是骗你的,真的。
的图片链接的形式应该是:
https://i.pximg.net/img-original/img/xxxx/xx/xx/xx/xx/xx/xxxxxxxx_p0.png
这样的,直接把这个网址复制网页栏访问会显示403,因为pixiv限制了必须从pixiv网页点进这个网址,所以我们首先必须headers构建refer-to,然后通过排行榜提取到信息后还需要自己手动构建正确的网址:
headers = {Referer: https://www.pixiv.net/,}
def get_accurate_url(url):urll=https://i.pximg.net/img-original/img/ + str(url) + "_p0.jpg"
return urll
这里的代码偷了个懒,全部当作jpg来处理,下载的时候再处理png的情况
下载的具体函数,我们对每一个网址的后续部分提取出来作名字,随机睡眠1到4秒防止pixiv认出我们是爬虫把我们ip给封了,之后就是对网址进行访问下载,这里如果访问返回的状态码是404说明它其实是个png格式的图片,所以对png格式的文件重新构建正确的网址即可:
def download(list,filename):i=1
for url in list:
pic_name=re.findall("https://i.pximg.net/img-original/img/(.*?)_p0.jpg",str(url))
pic_name1=str(pic_name[0]).replace("/",".")
r = random.randint(1, 4)
time.sleep(r)
response=requests.get(url=url,headers=headers,verify=False)
if(response.status_code==404):
the_url=https://i.pximg.net/img-original/img/ + str(pic_name[0]) + "_p0.png"
response = requests.get(url=the_url, headers=headers, verify=False)
with open(path + filename + / + str(pic_name1) + .png, wb) as f:
f.write(response.content)
print("第" + str(i) + "张图片已下载成功!!")
else:
with open(path + filename + / + str(pic_name1) + .jpg, wb) as f:
f.write(response.content)
print("第" + str(i) + "张图片已下载成功!!")
i+=1
最后就是成功下载排行榜的图片:
另外我在爬的时候发现pixiv很多网页获取时会隐藏body部分的内容,包括但不限于各个tag的网页和单个id图片的网页,一开始以为是没有登录的原因,但是实现登录后发现依然如此,推测可能是body部分内容是子网页或者javsscript生成之类的,反正前端有一万种方法达成这个目的,这个之后再研究怎么爬。
总结
到此这篇关于python爬虫实战项目之爬取pixiv图片的文章就介绍到这了,更多相关python爬取pixiv图片内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。