有时候学习的误区在于一直在看文档,一直在看基本的语法,从而导致很长时间不能看到学习的成果而灰心丧气;与其如此,不如拿实际的需求来学习,遇到不会的去查即可,当把需求完成后涉及的点再加以总结,效果会非常好,而且有成就感,正向激励自己。
本文讨论的是一个小爬虫,代码很少,就可以实现一个卡通图片网站(https://xkcd.com)的所有图片的抓取。
1 本地安装(win环境)
python 3.x(3.6.4),scrapy框架(1.5.1),至于如何安装,请google即可,遇到的问题都可以自己查到。
2 命令集合
其实是scrapy的命令集合
$ scrapy -h
Scrapy 1.5.1 - project: project
Usage:
scrapy <command> [options] [args]
Available commands:
bench Run quick benchmark test
check Check spider contracts
crawl Run a spider
edit Edit spider
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
list List available spiders
parse Parse URL (using its spider) and print the results
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
Use "scrapy <command> -h" to see more info about a command
3 创建爬虫项目
#利用下面两条命令执行
scrapy startproject project #创建了一个名为project的爬虫项目
cd /project/project/spiders 目录
scrapy genspider image #创建了一个名为image的爬虫
4 代码目录结构
scrapy.cfg:项目的配置文件
__init__.py:初始化文件,用来对项目做初始化工作
items.py:数据容器文件,用来定义要获取的数据
pipelines.py:管道文件,用来对items中的数据进行加工处理
settings.py:设置文件,包含了爬虫项目的设置信息
middlewares.py:中间件文件
spiders:爬虫目录,比如image.py就是所说的图片爬虫,由(3)中的第二个命令生成
5 代码分析
image.py文件分析
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from urllib import request
import urllib
import requests
import os
class ImageSpider(scrapy.Spider):
name = 'image' #爬虫名称
allowed_domains = ['xkcd.com'] #爬取网页域名
#组装爬取网页url列表
prefix = 'https://xkcd.com/'
start_urls = []
for i in range(1, 2050):
print(prefix + str(i) + '/')
start_urls.append(prefix + str(i) + '/')
def parse(self, response):
for sel in response.xpath('//div[@id="comic"]'):
link = sel.xpath('img/@src').extract()
url = "https:" + link[0]
print('downloading picture:' + url)
self.downloadImages(url) #定义图片下载方法
#download images by url
def downloadImages(self, url):
filename = os.path.basename(url)
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
response = requests.get(url, headers = headers)
path = 'C://pythonimages/' + filename
fp = open(path, 'wb')
fp.write(response.content)
fp.close()
本文只介绍了一个爬虫程序,后续将介绍爬虫框架等内容。