赞
踩
这次爬虫使用scrapy,所以用到的工具必然是python3.7,scrapy,pycharm这些东西,
目标网站:http://pic.netbian.com 彼岸图网,个人非常喜欢的图片网站,完全公开免费,几乎没有防爬措施,对于爬虫新手来说是费非常好的练手网站,不过各位练手的时候注意限制爬虫速度,不要对人家造成太大的负载。
在项目目录下创建爬虫项目,pycharm或者cmd输入创建命令
#标准的创建工程命令
scrapy startproject BiAnImgSpider
然后创建爬虫文件:
#netbian是创建爬虫的名字,pic.netbian.com是爬虫目标网站url
scrapy genspider netbian pic.netbian.com
再然后在项目目录下写个main.py 文件,用来模拟cmd命令测试和启动爬虫
main.py
from scrapy.cmdline import execute
import sys
import os
#这里就不细说了,反正命令行的命令都用这个叫execute的函数来执行就完事了,
#命令用列表存放
#每次运行这个文件就行了
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy","crawl","netbian"])
再然后就是正式分析编写这个爬虫的时候了
我的目标是爬取首页照片墙上展示的图片内容,包括下一页,下下页以及后续所有页的内容,在这里暂时不细分分类爬取。
我的思路是:根据首页的图片元素获取图片详情页的url > 进入详情页,然后获取详情页里大图的url > 然后根据大图的url交给scrapy下载保存
是不是很简单?
第一步:根据主站入口http://pic.netbian.com进入首页:
通过控制台定位到目标图片上,找到该图片的详情页的url:
图中a标签内的链接即是我们想要获取的url地址,当然这个要和网站url:http://pic.netbian.com拼接才能使用,即http://pic.netbian.com/tupian/25037.html是我们要的目标url,
下一步就是进入这个url,并获取该图片的大图url,方法也很简单,定位大图然后查看网页源码,就能看到大图的url了:
就这么简单粗暴的获取了最终想要的url,交给scrapy下载就好了,通过scrapy重复多次操作,这个爬取图片的功能就完成了。是不是爆炸简单??
打开spider文件,也就是我的netbian.py
引入这些要用到和可能会用到的模块,最好用到再引入,我这是完事后复制的所有用到的模块。
from urllib import parse
from scrapy.http import Request
from ..items import NetBianSpiderItem
import re
import scrapy
import time
parse函数是spider运行时第一个运行的函数,在这里我想要他获取下一个分页的url,然后通过yield Request()中的meta传给下一个处理本页面内容的函数,再下一个函数处理完当前页面的所有图片url后,再次请求parse函数获取下一个页面的url。
可能写的有点绕
反正parse函数的功能就是发送一个页面的url给page_parse函数处理再page_parse函数处理完后再次请求parse函数,这时parse函数给他下一个页面的url处理,依次类推,知道这个网站被爬的干干净净
def parse(self, response):
'''
返回分页url给下一个函数处理
:param response:
:return:
'''
#获取下一页的url
next_page_url = response.xpath('//div[@class="page"]/a[contains(text(),"下一页")]/@href').extract()[0]
next_url = parse.urljoin(self.start_urls[0],next_page_url)
print(response.url)
print(next_url)
yield Request(response.url,
meta={'next_url':next_url},
callback=self.page_parse,
)
用response.xpath()获取‘下一页’按钮中的url,与起始url拼接获取下一页的网站url
至于xpath规则嘛,需要各位费点心去琢磨一下,对于爬虫来说xpath,css,re这些东西还是需要用点时间去学习一下的。
程序到了page_parse函数
这个函数功能就是依次爬取在场所有图片的详情页url,组成列表,
然后通过for in迭代这个列表并拼接完整的图片详情页url
再然后发送这个url给下一个函数(img_url_parse)处理,
细节:
我们拼接url用到的就是urllib中的parse中的urljoin函数
from urllib import parse
parse.urljoin(self.start_urls[0],url)
很好用的函数
def page_parse(self,response): ''' 根据当前分页,获取图片详情页的url :param response: :return: ''' # 获取图片详情页的html元素信息列表 img_list = response.xpath('//ul[@class="clearfix"]/li/a/@href').extract() next_url = response.meta['next_url'] print('next_url:'+next_url) for url in img_list: img_html_url = parse.urljoin(self.start_urls[0],url) print(img_html_url) yield Request(img_html_url,callback=self.img_url_parse,dont_filter=True) yield Request(next_url,callback=self.parse,dont_filter=True)
在本页内容处理完后,for循环结束,那就得开始下一轮,所以继续请求parse函数,带上下一页的url,parse会给page_parse下一页的内容。
这个函数主要就是进入图片详情页爬取大图url,逻辑很简单
这里要用到item,得先去items.py写好这个类,在实例化对象,将结果通过yield传给item就行了
def img_url_parse(self,response): ''' 进入图片详情页,爬取大图url 获取标题 :param response: :return: ''' # 实例化item对象 item = NetBianSpiderItem() print('img_url_parse is running') img_big_url = response.xpath('//div[@class="photo-pic"]/a/img/@src').extract()[0] title = response.xpath('//div[@class="photo-pic"]/a/img/@alt').extract()[0].strip() title_list = title.split() #定义图片标题 img_title = '' img_title = img_title.join(title_list) + '.jpg' #拼接img_url img_url = parse.urljoin(self.start_urls[0],img_big_url) item['img_url'] = [img_url] item['img_title'] = [img_title] item['img_html_url'] = [response.url] yield item
切记[item_url]这么些不是瞎写的,不转成列表小心报错,
讲道理item类的编写很简单,每个字段都用scrapy.Field()写就好了,比Django的model还简单
class NetBianSpiderItem(scrapy.Item):
img_url = scrapy.Field()
img_title = scrapy.Field()
img_html_url = scrapy.Field()
item的强大建议自行百度:www.baidu.com
第一步ROBOTSTXT_OBEY = False:
第二步加入imagePipline,并更改优先级。(数字越小优先级越大)
注意:这里切记要安装PIL,不然报错,赶紧去pip install pillow
图片设置
IMAGES_STORE = ‘img’ 设置的img是指图片保存路径,这时项目根目录下
IMAGES_URLS_FIELD = 'img_url’这句设置的是图片url的item字段名,这里是‘img_url’
适当限速:
到这里大概功能就完成了,main文件run起来图片就会自动下载,(没问题的话),这个项目比较简单,数据库都还没有用上,也没有分类爬取存储,这个项目非常适合爬虫入门新手来熟悉一下爬虫流程和scrapy框架,
感谢http://pic.netbian.com,良心网站
后续还会迭代更新各种功能,记得关注
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。