Scrapy框架很好,也提供了很多扩展点,可以自己编写中间件处理Scrapy的Request和Response。但是可定制化或者可掌控性来说,还是自己写的爬虫更加强一些。
接下来,我们来看一下使用Python第三方库:requests和bs4抓取空姐网的美女。
requests和bs4
国际惯例,我们先了解一下requests和bs4。
requests是Python非常流行的处理网络数据的第三方库。相对于Python内置框架urllib、urllib2来说,requests提供的操作更加简洁而且更加丰富。如官方的requests示例:
requests示例
通过requests,我们可以很方便的发送GET、POST、DELETE、PUT请求,获取相应数据等等。
bs4是指BeautifulSoup 4.x版本。相对于BeautifulSoup 2.x和3.x,4.x提供了更加丰富和人性化的api。使用BeautifulSoup,我们可以很方便的定位到HTML中我们想要的元素,获取元素值等等。如:
bs4示例
查看空姐网结构
进入正题。
首先,我们查看一下空姐网的网页结构,找到每个人的相册页面。在kongjie.com里面随意翻翻,就能找到热门相册页面,如图:
相册页面
首先,分析一下该页面结构,提取出每个人的相册页链接。如图:
每个人的相册
class属性为ptw的div下,ul中的每一个li都是每个人的相册封面,通过提取li中的链接,就能进入每个人的相册。
开始爬取
从上面这个页面提取每个人相册链接的css表达式为“div.ptw li.d”。这样,我们就可以把这个表达式用在BeautifulSoup里面了。
如,
解析每个人的相册链接
现在,获取到了每个人的相册链接,接下来就是编写save_images_in_album()方法,进入每个人的相册里面抓取图片了。再提一下,再这里,我们提取完一页中每个人的相册链接之后,解析了网页里的“下一页”的链接,这样就能自动翻页抓取了。
下一页
要编写爬虫,我们还是获取一下浏览器访问这个页面时的Request Headers,这样,就能绕过一些简单的反爬虫手段。
Headers
然后,进入到相册内部,查看一下网页结构,如图:
相册内图片
我们得知,id为photo_pic,class为c的div里面,第一个超链接里面的img标签就是大图。所以,我们在这里提取这个链接。我们使用soup.find('div', id='photo_pic', class_='c')定位到id为photo_pic、class为c的div,然后通过image_div.a.img['src']就能拿到这个图片的链接了。
拿到一张图片的链接之后,我们需要切换到下一张图片。可以看到,大图下面最后面有个向右的箭头,这个是下一张图的按钮,我们获取这个按钮的链接,获取连接对应的css表达式为“div.pns.mlnv.vm.mtm.cl a.btn[title="下一张"]”,然后就可以重复上面两个步骤爬取相册里面所有的照片了。
在这里,我们怎么知道一个相册里的图片都爬取完成了呢?
我们使用redis来存放爬取了的图片id,如果一张图片id已存在redis中了,那么不爬取了,这样,我们就能很方便的知道一个相册是否爬取完了(相册中所有图片id都存在redis中了,就表示该相册爬取完了)。
因此,我们写出save_images_in_album()方法如下:
save_image_in_album
这里,我们从相册的url中,通过正则表达式:uid_picid_pattern = re.compile(r'.*?uid=(d+).*?picid=(d+).*?')解析出用户id和每张图片的id。然后就可以用redis来去重了。
下载图片
在上面这个函数里,我们拿到了每张图片大图的链接,即image_src变量。然后我们就可以编写save_img()方法来保存图片了。如:
save_img
运行结果
最后,我们在命令行运行Python kongjiewang.py。看一下结果:
运行结果
结果2
大功告成!
转载自原文链接, 如需删除请联系管理员。
原文链接:Python网络爬虫requests、bs4爬取空姐图片,福利哦,转载请注明来源!