我也是好久没有整活了呀铁子们,最近看上了一个叫魅宝网的网站里面图片嗯~你懂的嘿嘿嘿
别问为什么后续得图片都打码了,不打码过不了审得啊哥哥
魅宝网-美女写真图片,美女模特私房照片网 (abwzhuan.com)http://www.abwzhuan.com/首先咱们来分析目标网站,然后发现只要呼出调试窗口就会无限debugger 循环,这个不好分析网站呀,只要点击这个蓝色的箭头就会无限跳转到这里然后也不加载数据了
这个处理方法嘛我们先试验第一种在debugger这一行左边数字哪里右击选择箭头所指的那个,意思就是永远不在这里断点,经过测试点击之后我们在点击蓝色的箭头就可以正常调试网站了,不会在出现
第二种方法嘛,点击这个按钮之后会弹出一个输入框,在输入框里面输入false回车之后我们在点击蓝色的箭头也是可以正常调试网站的
以上两种方法吧不能适用所有网站,如果遇到别的网站无法适用的话,我们就用Fiddler抓包然后重写文件在返回给浏览器,这个过几天我会单独出一篇文章来讲如何抓包重写
到这里就没有什么大问题了开始正常分析网站,可以看到图片详情页都是在
//div[@class="placeholder"]/a/@href 这个里面的
用xpath验证了一下没有问题哈
那么这一页爬取完,我要爬取下一页怎么办?可以看到需要点击这个按钮,而且点击之后网址并无变化,这也是一个前后端交互的网站
我们来分析一下 每次加载会多一个这样的文件 只有page/{}这里的数字有变化,这个很有可能就是翻页的文件,那么我们只需要构造尾部的数字即可实现翻页获取的效果
我们来写好前面代码伪造一个headers 里面记得传入cookie 有些网站会识别身份信息,也要传入Referer这个是标记你从哪里来的,如果没有这些参数待会下载图片的时候可能会失败,我为了保险起见也加了Host,还有就是大家不要为了下载快而把那段随机暂停的代码去掉,毕竟如果爬取太快把别人网站爬崩了,那可是要去局子喝茶的哟~
import requests import random #随机模块 from lxml import etree import time UserAgents = ['这里面存储你们的请求头'] user_agent = random.choice(UserAgents) # 使用随机请求头 headers = {'User-Agent': user_agent, 'Cookie':'X_CACHE_KEY=292b6a4a0ebc1a4c227ee50e14c4cef0; __51vcke__JJF6u7Uarq5xM561=ec59775c-bbab-569e-b893-3d73dcc37223; __51vuft__JJF6u7Uarq5xM561=1637834687423; cao_notice_cookie=1; __51uvsct__JJF6u7Uarq5xM561=2; PHPSESSID=316mo0fl1u3h59e8f8m393kapv; __vtins__JJF6u7Uarq5xM561=%7B%22sid%22%3A%20%227db4ef0d-7bde-56d3-821a-7508134d21bc%22%2C%20%22vd%22%3A%2016%2C%20%22stt%22%3A%201180142%2C%20%22dr%22%3A%20229714%2C%20%22expires%22%3A%201637849029367%2C%20%22ct%22%3A%201637847229367%7D', 'Referer':'http://www.abwzhuan.com/siwameinv', 'Host':'www.abwzhuan.com' } def page_url(url): response = requests.get(url, headers=headers) # print(response.text) # print('====='*40) # text = response.text content = response.content.decode('utf8') # 解析html字符串 html = etree.HTML(content) detail_urls=html.xpath('//div[@class="placeholder"]/a/@href') #详情页的url for detail_url in detail_urls: # print(detail_url) jiexi(detail_url) #这里我后续定义了一个jiexi函数 循环去解析返回的职位详情页 time.sleep(random.uniform(1, 3)) #随机暂停 if __name__ == '__main__': for x in range(1,16): #这里面输入你们想爬取的页数,python里面是左包又不包也就是如果是1-16 ,实际上获取的是1-15页 url='http://www.abwzhuan.com/cosplay/page/{}'.format(x) page_url(url)
可以看到是在这个标签下面,那么我们来写一下解析详情页的函数吧
不管是下载图片还是写入啥,都记得要使用try试着去运行,不然如果出现意外报错就得从头获取了,因为这个程序不是增量爬虫,增量爬虫得话就是哪怕你报错暂停了重新运行是不会在爬取之前获取过的,等有时间了我专门写一期增量爬虫得
count=0 def jiexi(url): response = requests.get(url, headers=headers) content = response.content.decode('utf8') # 解析html字符串 html = etree.HTML(content) imgs=html.xpath('//p/img[@loading="lazy"]/@src') #获取图片url # print(imgs) try: for img in imgs: image_content = requests.get(img).content # 获取到之后去转码为二进制 global count # 这里要声明一下是全局变量不然有时候跑起来会报错说提前被赋值 with open("这里写你创建的文件夹的位置/{}.jpg".format(count), "wb") as f: f.write(image_content) count = count + 1 print("成功下载第{}张图片!".format(count)) except: print('这个图片有问题'+img)
果然啊!!在运行得时候有个图片出问题了
最后也是获取了1099张图片呀
import requests import random #随机模块 from lxml import etree import time UserAgents = ['这里面存储你们的请求头'] user_agent = random.choice(UserAgents) # 使用随机请求头 headers = {'User-Agent': user_agent, 'Cookie':'X_CACHE_KEY=292b6a4a0ebc1a4c227ee50e14c4cef0; __51vcke__JJF6u7Uarq5xM561=ec59775c-bbab-569e-b893-3d73dcc37223; __51vuft__JJF6u7Uarq5xM561=1637834687423; cao_notice_cookie=1; __51uvsct__JJF6u7Uarq5xM561=2; PHPSESSID=316mo0fl1u3h59e8f8m393kapv; __vtins__JJF6u7Uarq5xM561=%7B%22sid%22%3A%20%227db4ef0d-7bde-56d3-821a-7508134d21bc%22%2C%20%22vd%22%3A%2016%2C%20%22stt%22%3A%201180142%2C%20%22dr%22%3A%20229714%2C%20%22expires%22%3A%201637849029367%2C%20%22ct%22%3A%201637847229367%7D', 'Referer':'http://www.abwzhuan.com/siwameinv', 'Host':'www.abwzhuan.com' } def page_url(url): response = requests.get(url, headers=headers) # print(response.text) # print('====='*40) # text = response.text content = response.content.decode('utf8') # 解析html字符串 html = etree.HTML(content) detail_urls=html.xpath('//div[@class="placeholder"]/a/@href') for detail_url in detail_urls: # print(detail_url) jiexi(detail_url) #循环去解析返回的职位详情页 time.sleep(random.uniform(1, 3)) #随机暂停 count=0 def jiexi(url): response = requests.get(url, headers=headers) content = response.content.decode('utf8') # 解析html字符串 html = etree.HTML(content) imgs=html.xpath('//p/img[@loading="lazy"]/@src') # print(imgs) try: for img in imgs: image_content = requests.get(img).content # 获取到之后去请求 global count # 这里要声明一下是全局变量不然有时候跑起来会报错说提前被赋值 with open("F:\写好的爬虫\各种用法\美图\cosplay/{}.jpg".format(count), "wb") as f: f.write(image_content) count = count + 1 print("成功下载第{}张图片!".format(count)) except: print('这个图片有问题'+img) if __name__ == '__main__': for x in range(1,16): url='http://www.abwzhuan.com/cosplay/page/{}'.format(x) page_url(url)
对了还有一件事~看完觉得可以的话点个赞吧,切莫白嫖
至此程序就全部写完啦
本文仅限于做技术交流学习,请勿用作任何非法用途!