原博文链接:http://www.aobosir.com/blog/2016/12/26/python3-large-web-crawler-169bb-com-HD-beautiful-pictures/
开发环境
- Python第三方库:lxml、Twisted、pywin32、scrapy
- Python 版本:python-3.5.0-amd64
- PyCharm软件版本:pycharm-professional-2016.1.4
- 电脑系统:Windows 10 64位
如果你还没有搭建好开发环境,请到这篇博客。
- 本篇博客源代码GitHub里:这里。
这一篇博客的目的是爬取 169美女图片网 里面的所有的“西洋美女”的高清图片。
爬虫程序设计思路:
1 . 先得到 http://www.169bb.com/xiyangmeinv/ 页面里面所有的照片后面对应的URL网页链接(如)。
2 . 接着在得到的URL链接网页里面得到里面所有高清图片的下载地址,进行下载。
3 . 得到所有 “西洋美女” 网页的页数。
观察网页 和 网页源代码
1 . 打开 169美女图片网:http://www.169bb.com/
2 . 我们的目的是爬取这个站点里面所有 “西洋美女” 的高清图片。所以点击进入“西洋美女” 标签里。(http://www.169bb.com/xiyangmeinv/)
3 . 观察这个页面,在页面最下面,显示了,当前一共311页。
4 . 我们再来观察每页的网址有什么共同点,我们发现:第2页的网站是:http://www.169bb.com/xiyangmeinv/list_4_2.html;第3页的网址是:http://www.169bb.com/xiyangmeinv/list_4_3.html;而第1页的网站是:http://www.169bb.com/xiyangmeinv/list_4_1.html
这样每页的网址是有规律的,按照这个规律,我们可以推测出“西洋美女” 的第120页的网址就应该是:http://www.169bb.com/xiyangmeinv/list_4_120.html。事实的确是这样的。好。
5 . 现在,我们随便点击一个图片,进去看看这个美女的高清图片集。
里面都是高清的图片,并且有很多,并且,不止一页。就我随机点击的这个美女的链接就有11页,并且一页里面有5张左右的高清图片。
6 . 并且它的每页的网址也是有规律的。
第2页是:http://www.169bb.com/xiyangmeinv/2016/1117/37333_2.html
第3页是:http://www.169bb.com/xiyangmeinv/2016/1117/37333_3.html
第1页是:http://www.169bb.com/xiyangmeinv/2016/1117/37333.html
…
但是有的美女的网址里只有一页,比如这个:http://www.169bb.com/xiyangmeinv/2016/0103/5974.html
好了,现在这个目标网页,我们已经分析完了。现在就可以编程。
写程序
源代码GitHub里:这里。
接下来我们为大家讲解大型图片爬虫项目编写实战。
Step 1 .
创建一个Scrapy爬虫项目:
scrapy startproject secondDemo
创建一个scrapy爬虫文件,我们就在这个文件里面写爬取目标网站里面图片的爬虫程序。
cd secondDemo
scrapy genspider -t basic pic_169bb 169bb.com
用 PyCharm 软件打开刚刚创建的 secondDemo
工程。
Step 2 . 在 items.py
文件里面的SeconddemoItem()
函数里面创建一个对象,这个对象在其他的文件里面会使用到。
Step 3 . 现在开始爬虫的编写。进入pic_169bb.py
文件。
爬虫(pic_169bb.py
文件)会自动的先爬首页(http://169bb.com/),爬完首页之后,会自动的进入parse()
回调函数。
这个回调函数中,我们需要写些东西。
先获取所有栏目的名字和地址。
查看源代码:
在pic_169bb.py
文件中的 parse()
回调函数中添加下面的代码:
urldata = response.xpath("/html/body/div[@class='header']/div[@class='hd_nav']/div[@class='w1000']//a/@href").extract()
print(urldata)
现在运行一下,输出:
继续进行下一次的爬取:
先导入一个模块
from scrapy.http import Request
爬取子栏目的第一页,即西洋美女网址的第一页。
xiyangurldata = urldata[4] # 获取西洋美女首页网址
print(xiyangurldata)
yield Request(url=xiyangurldata, callback=self.next)
def next(self, response):
pass
def next(self, response):
page_title_list = response.xpath("/html/body//div[@class='w1000 box03']/ul[@