不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法
1.浏览器浏览分析地址变化规律
2.Python测试类获取网页内容,从而获取图片地址
3.Python测试类下载图片,保存成功则爬虫可以实现
二、豆瓣美女(难度:)
(其中cid:2-胸3-腿4-脸5-杂6-臀7-袜子index:页数)
2.通过python调用,查看获取网页内容,以下是Test_Url.py的内容
通过urllib.request.Request(Url)请求网站,BeautifulSoup解析返回的二进制内容,re.findall()匹配图片地址
最终print(get_list)打印出了图片地址的一个列表
3.通过python调用,下载图片,以下是Test_Down.py的内容
通过urllib.request.Request(image_url)获取图片,然后写入本地,看到路径下多了一张图片,说明整个爬虫实现是可实现的
4.综合上面分析,写出完整爬虫代码douban_spider.py
运行程序,进入文件夹查看,图片已经不停的写入电脑了!
5.分析:豆瓣图片下载用比较简单的爬虫就能实现,网站唯一的控制好像只有不能频繁调用,所以豆瓣不适合用多线程调用
三、MM131网(难度:)
2.Test_Url.py,双重循化先获取图片人物地址,在获取人物每页的图片
3.下载图片Test_Down.py,用豆瓣下载的方法下载,发现不论下载多少张,都是一样的下面图片
这个就有点尴尬了,妹子图片地址都有了,就是不能下载,浏览器打开的时候也是时好时坏,网上也找不到原因,当然楼主最终还是找到原因了,下面先贴上代码
可以看到下载成功,改用requests.get方法获取图片内容,这种请求方法方便设置头文件headers(urllib.request怎么设置headers没有研究过),headers里面有个Referer参数,必须设置为此图片的进入地址,从浏览器F12代码可以看出来,如下图
4.测试都通过了,下面是汇总的完整源码
运行程序后,图片将源源不断的写入电脑
5.分析:MM131图片下载主要问题是保存图片的时候需要用headers设置Referer
四、煎蛋网(难度:)
(index:页数)
2.Test_Url.py,由于通过urllib.request.Request会被拒绝
通过requests添加headers,返回的html文本如下
从上面关键结果可以看到,
(1)通过Python的execjs模块直接调用JS里面的函数,将这个hash转为图片地址,具体实现就是把当前网页保存下来,然后找到里面的js转换方法函数,单独拎出来写在一个JS里面
调用的JS和方法如下:OOXX1.jsCallJS.python
1functionOOXX1(a,b){2returnmd5(a)3}4functionmd5(a){5return"Success"+a6}1importexecjs234#执行本地的js5defget_js():6f=open("OOXX1.js",'r',encoding='UTF-8')7line=f.readline()8htmlstr=''9whileline:10htmlstr=htmlstr+line11line=f.readline()12returnhtmlstr131415js=get_js()16ctx=execjs.compile(js)17ss="SS"18cc="CC"19print(ctx.call("OOXX1",ss,cc))此种方法只提供思路,楼主找到的JS如下OOXX.js,实际调用报错了,这个方法应该会比方法二速度快很多,所以还是贴上未完成代码供读者朋友参阅研究
(2)通过Python的selenium调用Chrome的无头浏览器(说明:低版本的Python可以用Phantomjs无头浏览器,Python3.6是直接弃用了这个浏览器,只好选择Chrome)
3.下载图片用上面提到过的urllib.request.Request方法就可以实现
4.测试都通过了,下面是汇总的完整源码OOXX_spider.py
5.分析:用调用chrome方法速度会比较慢,不过这个方法会是反爬虫技术越来越先进的必然选择,如何提速才是要考虑的关键
五、其他直接贴完整代码(难度:)
六、总结和补充
1.获取网页内容有三种方式
urllib.request.Request和urllib.request.urlopen
——速度快,很容易被发现,不能获取js执行后的网页内容
requests带headers的请求方法
——速度快,可以实现伪装,不能获取js执行后的网页内容
chromeheadless方法
——速度慢,等于浏览器访问,可以获取js执行后的网页内容