学爬虫,不爬点图,学他有啥用呀!开搂!
大家都在爬,校花网,咱也拿来练练手。
一、安装Scrapy运行环境
1、安装wheel
pip install wheel
2、安装lxml
https://pypi.python.org/pypi/lxml/4.1.0
3、安装pyopenssl
https://pypi.python.org/pypi/pyOpenSSL/17.5.0
4、安装Twisted
https://www.lfd.uci.edu/~gohlke/pythonlibs/
5、安装pywin32
https://sourceforge.net/projects/pywin32/files/
6、安装scrapy
pip install scrapy
注:windows平台需要依赖pywin32,请根据自己系统32/64位选择下载安装,https://sourceforge.net/projects/pywin32/
二、创建工程
2.1、创建工程
在控制台模式下进入你要建立工程的文件夹执行如下命令创建工程:
scrapy startproject pic
这里的pic是工程名,框架会自动在当前目录下创建一个同名的文件夹,工程文件就在里边。
2.2、创建爬虫程序
cd movie
scrapy genspider xh www.xiaohuar.com
2.3、自动创建目录及文件
2.4、文件说明:
- scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
- spiders: 爬虫目录,如:创建文件,编写爬虫规则,之后您将在此加入代码。
- xh.py 自动创建的爬虫文件
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- middlewares.py: 是和Scrapy的请求/响应处理相关联的框架。
- pipelines 用来对items里面提取的数据做进一步处理,如保存等。
- settings.py 配置文件,如:递归的层数、并发数,延迟下载等
注意:一般创建爬虫文件时,以网站域名命名
三、分析要爬的网页
爬取思路:从页面设计来看,采用分页,图片流的方式展示校花图片,每张图片的dom结构是一样的,分页按钮自带页面链接,这样我们就可以一页一页来采集图片,并去重保存当前页面的分页链接,然后遍历保存下的页面,从而获取所有页面上的图片。
四、开始编写程序
推荐使用PyCharm编辑器编写调试,使用方便。直接打开生成的工程目录就可以了。
4.1 设置数据存储模板
items.py
import scrapy
class PicItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
addr = scrapy.Field()
pass
注:name: 图片名称
addr: 图片访问地址
4.2 编写爬虫
# -*- coding: utf-8 -*-
import scrapy
import os
from scrapy.http import Request
# 导入item中结构化数据模板
from pic.items import PicItem
class XhSpider(scrapy.Spider):
# 爬虫名称,唯一
name = "xh"
# 允许访问的域
allowed_domains = ["www.xiaohuar.com"]
# 初始URL
start_urls = ['http://www.xiaohuar.com/daxue/']
# 设置一个空集合
url_set = set()
def parse(self, response):
# 如果图片地址以http://www.xiaohuar.com/daxue/index_或http://www.xiaohuar.com/daxue/开头,我才在上面去图片信息。
if response.url.startswith("http://www.xiaohuar.com/daxue/index_") or response.url == 'http://www.xiaohuar.com/daxue/':
allPics = response.xpath('//div[@class="card diy-box shadow mb-5"]/a')
for pic in allPics:
# 分别处理每个图片,取出名称及地址
item = PicItem()
name = pic.xpath('./img/@alt').extract()[0]
addr = pic.xpath('./img/@src').extract()[0]
item['name'] = name
item['addr'] = addr
print(name + '######' + addr)
# 返回爬取到的信息
yield item
# 获取所有的地址链接(因为图片页地址是有规律的以/daxue/index_开头,下一页会多一页下一页的地址)
urls = response.xpath("//a/@href").extract()
for url in urls:
# 如果地址以/daxue/index_开头且不在集合中,则获取其信息
if url.startswith("/daxue/index_"):
url = 'http://www.xiaohuar.com' + url
if url in XhSpider.url_set:
pass
else:
XhSpider.url_set.add(url)
# 回调函数默认为parse,也可以通过from scrapy.http import Request来指定回调函数
# from scrapy.http import Request
# Request(url,callback=self.parse)
yield self.make_requests_from_url(url)
else:
pass
4.3 设置配置文件
settings.py增加如下内容
# 设置处理返回数据的类及执行优先级
ITEM_PIPELINES = {
'pic.pipelines.PicPipeline': 100,
}
4.4 编写数据处理脚本
pipelines.py
import urllib.request
import os
class PicPipeline(object):
def process_item(self, item, spider):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}
req = urllib.request.Request(url=item['addr'], headers=headers)
res = urllib.request.urlopen(req)
filePath = r'D:\my\down_pic';
if not os.path.exists(filePath):
os.makedirs(filePath)
file_name = os.path.join(filePath, item['name'] + '.jpg')
with open(file_name, 'wb') as fp:
fp.write(res.read())
将每一页的图片都存储到D:\my\down_pic文件夹下
五、 执行爬虫
cd pic
scrapy crawl xh --nolog
或者直接在PyCharm里执行:
添加启动文件start.py在根目录下:
#coding=utf-8
#!文件类型: python
#!创建时间: 2018/12/4 16:42
#!作者: SongBin
#!文件名称: start.py
from scrapy import cmdline
cmdline.execute("scrapy crawl xh".split())
将其设置为启动文件就可以了
六、 结果
相关推荐
不要着急,慢慢更新
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载