上接:
Python3网络爬虫教程17——分布式爬虫Scrapy基础
4. 简单实例(爬取一条名言)
- 创建一个简单的爬虫实例
- 第一步:创建一个scrapy项目
- 创建命令:scrapy startproject mingyan2(mingyan2是我取的项目文件夹名称)
- 打开CMD窗口,CD命令切换到要放置爬虫项目文件夹下面,然后执行上述命令
- 执行命令及文件夹下面的有哪些东西参考: 爬虫1.png 爬虫2.png
- 第二步:编写爬虫的主程序py文件
- 在spiders文件夹下新建mingyan_spider.py文件
- 然后里面编写代码
- 参考mingyan_spider.py文件
- 第三步:执行爬虫命令
- CD到刚刚的项目文件mingyan2下
- 执行命令:scrapy crawl mingyan2
- 刚刚主程序里面定义了一个,name = ‘mingyan2’
- 上面的命令中的mingyan2是这个name的名称,不是文件夹的名称,只不过这里名称一样
- 执行结束后,mingyan2文件下自动保存了刚刚爬取到的两个url的页面
- 参考: 爬虫3.png
- 参考实例mingyan_spider.py
import scrapy
# 定义一个mingyan类,继承Spider父类
class mingyan(scrapy.Spider):
# 定义蜘蛛名
name = 'mingyan2'
# 此方法通过下面链接爬取页面
def start_requests(self):
urls = [
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
'http://lab.scrapyd.cn/page/3/',
]
# 爬取到的页面直接调用下面定义的parse方法处理
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
'''
start_requests已经爬取到页面,那如何提取我们想要的内容呢?那就可以在这个方法里面定义。
这里的话,并木有定义,只是简单的把页面做了一个保存,并没有涉及提取我们想要的数据,后面会慢慢说到
也就是用xpath、正则、或是css进行相应提取,这个例子就是让你看看scrapy运行的流程:
1、定义链接;
2、通过链接爬取(下载)页面;
3、定义规则,然后提取数据;
就是这么个流程,似不似很简单呀?
'''
# 根据url请求得到页面,提取里面的页码,如:/page/1/,提取到倒数第二个元素的就是:1
page = response.url.split('/')[-2]
# 拼接文件名称,如果是第一页,最终文件名便是:mingyan-1.html
filename = 'mingyan-%s.html' % page
# 保存爬取到的网页内容
# wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
with open(filename, 'wb') as f:
# 将下载页面中的body标签下的内容写入
f.write(response.body)
5. scrapy shell使用
- scrapy调试工具
- CMD窗口切换到项目文件下执行命令:scrapy shell 网址
- scrapy shell http://lab.scrapyd.cn
- scrapy shell http://www.baidu.com
- 退出调试执行命令:exit
- 参考: 爬虫4.png 爬虫5.png
6. scrapy css选择器使用(爬取一页的名言)
- 执行调试命令:scrapy shell http://lab.scrapyd.cn
- 先提取HTML的title: response.css(‘title’)
- 得到一个Selector的列表
- []
- 换种写法,每次可以得到不同的结果
- response.css(‘title’).extract()
[‘爬虫实验室 - SCRAPY中文网提供’] - response.css(‘title’).extract()[0]
‘爬虫实验室 - SCRAPY中文网提供’ - response.css(‘title’).extract_first()
‘爬虫实验室 - SCRAPY中文网提供’ - response.css(‘title::text’).extract_first()
‘爬虫实验室 - SCRAPY中文网提供’ - 我们其实一般都值需要标签里面的具体内容所有执行
- response.css(‘title::text’).extract_first()
- 参考:爬虫6.png
先项目文件下执行:scrapy shell http://lab.scrapyd.cn
接着执行: mingyan1 = response.css(‘div.quote’)[0]
每一段名言都被一个
- 包裹
我们就把第一段名言保存在:mingyan1 这么一个变量里面了。
为什么会有一个:[0] 这表示提取第一段,如果没有这个限制,那我们提取的是本页所有名言
网页源码
继续执行:mingyan1.css(’.text::text’).extract_first()
使用了:.text这是class选择器,提取第一个内容
mingyan1.css(’.tags .tag::text’).extract()
我们用的并非是.extract_first() 而是 extract(),why?应为里面有多个标签,我们并非只是提取一个,
而是要把所有标签都提取出来,因此就用了:.extract()
并且用了两次标签tags,意思是提取第二个标签里面的内容
参考:爬虫7.png
参考网址:http://www.scrapyd.cn/doc/147.html
参考实例ItemSpider.py
- 参考实例ListSpider.py
- ItemSpider.py
……
看官,此页面只为爬虫练习使用,都是残卷,若喜欢可以去找点高清版!
作者:中国传世名画
【详情】
标签:
艺术,
名画
# 提取http://lab.scrapyd.cn中的五条名言
# 分别按编号+作者的方式保存为5个文件
import scrapy
# 定义一个mingyan类,继承Spider父类
class ItemSpider(scrapy.Spider):
# 定义蜘蛛名
name = 'ItemSpider'
start_urls = ['http://lab.scrapyd.cn']
def parse(self, response):
# 提取页面中的所有的名言
mingyanPage1 = response.css('div.quote')
number1 = 0
for mingyan in mingyanPage1:
# 提取css中text标签对应的文字内容,名言的正文
text = mingyan.css('.text::text').extract_first()
# 提取作者
author = mingyan.css('.author::text').extract_first()
# 提取标签
tags = mingyan.css('.tags .tag::text').extract()
# 数组转换为字符串
tags = ', '.join(tags)
# 将爬去的内容存入文件,文件名为:编号. 作者-语录.txt
number1 += 1
filename = '%s. %s-语录.txt' %(number1, author)
# 以写的方式打开文件并写入内容
with open(filename, "w") as f:
f.write(text)
f.write('\n')
f.write('标签: ' + tags)
f.close()
ListSpider.py
# 提取http://lab.scrapyd.cn中的五条名言
# 相同作者的名言保存在一个文件中,采用追加的方式写入
import scrapy
# 定义一个mingyan类,继承Spider父类
class ListSpider(scrapy.Spider):
# 定义蜘蛛名
name = 'ListSpider'
start_urls = ['http://lab.scrapyd.cn']
def parse(self, response):
# 提取页面中的所有的名言
mingyanPage1 = response.css('div.quote')
for mingyan in mingyanPage1:
# 提取css中text标签对应的文字内容,名言的正文
text = mingyan.css('.text::text').extract_first()
# 提取作者
author = mingyan.css('.author::text').extract_first()
# 提取标签
tags = mingyan.css('.tags .tag::text').extract()
# 数组转换为字符串
tags = ', '.join(tags)
# 将爬去的内容存入文件,文件名为:编号. 作者-语录.txt
filename = '%s-语录.txt' %(author)
# 以追加的方式写入文件,文件名相同(即作者相同),会写在同一个文件
with open(filename, "a+") as f:
f.write(text)
f.write('\n')
f.write('标签: ' + tags)
f.write('\n---------------\n')
f.close()
本章案例源代码及输出结果图片查看GITHUB:
https://github.com/FangbaiZhang/TLXY_study_note/tree/master/Spider
Python3网络爬虫教程19——分布式爬虫Scrapy实例(爬取多个页面)