本文针对python3,阅读前请确定您已经了解最基础的python语法,并安装了python3、pip3、scrapy、pymysql等基础模块
什么是 scrapy
我理解为就是用最简单的代码,可以迅速的爬取到更多的内容的一个python框架
开始一个scrapy项目
在你想创建项目的目录中,执行 scrapy startproject 项目名称
,这样就会在该目录中,生成一个以项目名称命名的项目目录。
写一个爬虫项目需要用到的主要文件:
你会发现,项目中好像一共就只有这些文件
- spiders目录 ——— 执行
scrapy genspider 爬虫名称 目标主域名
会生成一个爬虫文件,该文件就是爬取网页数据处理逻辑的主要文件。 - items.py ——— 这家伙就像是一辆小货车,把你爬取的数据打包装车,运到后面的pipelines.py中
- pipelines.py ——— 这是你最后对已获取的数据内容进行处理的地方,小货车把数据搬过来了,你只需要在这里把他们扔进仓库或是存到文件就好
- middlewares.py ——— 去别人的地方偷东西,主人肯定是会防备的,今天装个护栏网,明天弄个防盗门。这个文件,就是进行伪装的地方,让对方网站识别不出我们是蜘蛛,而是真的访客。
- settings.py ——— ,显而易见,这是我们的配置文件。
工作流程
打个比方,这个框架就是个小偷团伙:
- spiders内的爬虫文件,是直接出动的扒手。
- 在到目标超市前,先让middlewares.py这个化妆师给伪装一下。
- 然后到目标超市中专找贵的东西批量、精确的下手。
- 偷到东西后,随偷随放到items.py这个传送带中运走
- 运输到pipelines.py这个后勤部后,直接把东西分类存放起来。
实际操作
接下来,就让我们按步骤,实际操作一下。
第一步:
在spiders目录中,创建自己的爬虫文件testspider.py
。如果比较熟练的话,就直接scrapy genspider testspider scrapyd.cn
,会直接生成带下面代码的文件。这就是我们爬虫的主文件,他必须继承scrapy类
定义一个类,像下面这样,当然还有另外一个写法,不过我不太推荐。
import scrapy
class TestSpider(scrapy.Spider):
name = 'testspider' # 爬虫名称,注意名字不能与项目名称相同
allowed_domains = ['scrapyd.cn'] # 过滤器,非在这个主域下的不去爬取
start_urls = ['http://lab.scrapyd.cn'] # 目标网址,可以是个数组
# 默认的解析函数
def parse(self, response):
pass
在上面的代码块里,你可以看到这样几项。
- name ——— 爬虫的名称,一个项目中,爬虫名称是唯一的,这样你才可以在执行的时候准确的喊,王大蛛,上。
- allowed_domains ——— 这个列表中写的要过滤的内容
- start_urls ——— 这就是要爬取的目标网址,当你执行
scrapy crawl 王大蛛
时,爬虫程序就会像人正常访问网页一样,访问一下start_url中的网页,并且补货网页的全部html信息回来,直接扔给parse方法,你可能已经注意到parse方法中的response参数了。 - parse方法 ——— 当爬虫执行后,把页面完整的获取过来,传递到response中,parse方法,去处理response中我们想要的数据,以及提取要继续深度爬取的url,如分页,详情页。
注意,页面如果是js渲染的话,需要另行处理。
先写个简单的栗子:
import scrapy
class TestSpider(scrapy.Spider):
name = 'testspider' # 爬虫名称,注意名字不能与项目名称相同
allowed_domains = ['scrapyd.cn'] # 过滤器,非在这个主域下的不去爬取
start_urls = ['http://lab.scrapyd.cn'] # 目标网址,可以是个数组
# 默认的解析函数
def parse(self, response):
title = response.css('title::text').get() # css选择器,获取页面title标签内的文字内容
detail_url = response.css('div.quote span:nth-child(2) a::attr(href)').get() # 获取第一个文章详情页链接
相信你注意到了,response.css(),这是对页面标签的选择器,熟悉js的兄弟们,一看就笑了,这个我会啊! 当然,如果你不熟悉css选择器,可以选择另外一个response.xpath()这个东西上手起来,简直不能更简单了。
注意:get()获取第一个,getall()获取所有,获取所有后,可以遍历去进行下一步操作,使用控制台查看页面的元素会对你有很大的帮助
scrapy shell的使用
这家伙就是一个调试工具,在你写css和xpath选择器的时候,总不能每次写完,都执行一下爬虫,看看是不是写错了要爬的内容。如何使用:
- 在terminal中执行 scrapy shell 目标网址,回车。 当你看到三个箭头时
>>>
,就可以开始调试的。
输入response.css('title::text').get()
回车试试看
更多的东西,可以看第二章。