爬虫scrapy抓取w3school课程列表

释放双眼,带上耳机,听听看~!

首先还是先创建scrapy项目,当然这都是在你安装scrapy之后啊,这个scrapy还是在linux系统下最省事,一行指令瞬间安装,这酸爽。。。。。

言归正传啊,创建scrapy文件。


1
2
1<span style="font-size:14px;">scrapy startproject w3school</span>
2

之后可以查看一下,这个文件的结构,上一次抓取天气的时候还记得吗,我们采用的是tree命令。


1
2
1<span style="font-size:14px;">tree w3school</span>
2

你就能看见一个树形的文件目录。

现在我们开始编写爬虫中的文件,其实需要编写的只有4个文件,items.py pipelines.py setting.py spider.py。现在只是最初级啊,因为现在我还只是一个菜鸟,哇咔咔。

items文件是一个容器,所谓Item容器就是将在网页中获取的数据结构化保存的数据结构,类似于python中字典。按我的理解就是你需要提取什么就写一个Field()。当然这个理解还是很初步的啊,但我坚信在实践中成长才是最快速的,刚开始的时候就是要不求甚解,用的次数多了,随着深入的学习自然就明白
了。


1
2
3
4
5
6
7
1import scrapy
2
3class W3SchoolItem(scrapy.Item):
4    title = scrapy.Field()
5    link = scrapy.Field()
6    desc = scrapy.Field()
7

1
2
1  之后我们可以编写爬虫文件或者pipelines文件都可以。pipelines文件主要完成数据的查重、丢弃,验证item中数据,将得到的item数据保存等工作。  也就是说抓取的数据都是会返回到pipilines文件中.爬虫文件中会有一个parse()函数,最后有一个return items会返回一个列表。其中的codec模块是专门用来转换编码用的。
2

process_item函数参数的含义:
item (Item object) – 由parse方法返回的Item对象
spider (BaseSpider object) – 抓取到这个Item对象对应的爬虫对象


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1# -*- coding: utf-8 -*-
2
3import json  
4import codecs
5# Define your item pipelines here
6#
7# Don't forget to add your pipeline to the ITEM_PIPELINES setting
8# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
9
10class W3SchoolPipeline(object):
11  def __init__(self):
12      self.file = codecs.open('W3School_data.json','wb',encoding = 'utf-8')#初始化创建一个W3School_data.json的文件
13      def process_item(self, item, spider):
14          line = json.dumps(dict(item)) + '\n'#对数据类型进行编码
15          print line
16          self.file.write(line.decode("unicode_escape"))
17          return item
18
19

1
2
1写完pipelines文件之后就一定要在setting文件中添加一行代码。从Spider的parse返回的Item数据将依次被ITEM_PIPELINES列表中的Pipeline类处理。  
2

1
2
1ITEM_PIPELINES = {'w3school.pipelines.W3SchoolPipeline':300}
2

1
2
1  最后开始编写我们的爬虫文件,就是从网页源代码中提取我们想要的信息。scrapy官方推荐使用xpath来提取,比较方便快捷。爬虫文件中有三个参数一定要写,一个是name这个相当于爬虫的代号,因为爬虫你可以写很多个,但是调用的时候只能调用一个爬虫为你工作,name在调用的时候会用的到。还有一个allowed_domains属性,scrapy有一個offsite機制,即是否抓其他域名,需要將allowed_domains屬性添加上sina.com.cn。最后还有一个start_urls属性,包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
2

scrapy还提供了log功能,具体我也不知道它有什么功能,应该是可以捕捉scrapy的日志。里面的msg()函数可以记录信息,然后会将信息显示在终端窗口中,有点C++里messagebox的意思。

Scrapy提供5层logging级别:
:data:

1
1`

~scrapy.log.CRITICAL

1
1`

– 严重错误(critical)
:data:

1
1`

~scrapy.log.ERROR

1
1`

– 一般错误(regular errors)
:data:

1
1`

~scrapy.log.WARNING

1
1`

– 警告信息(warning messages)
:data:

1
1`

~scrapy.log.INFO

1
1`

– 一般信息(informational messages)
:data:

1
1`

~scrapy.log.DEBUG

1
1`

– 调试信息(debugging messages)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1from scrapy.spider import Spider
2from scrapy.selector import Selector
3from scrapy import log
4from w3school.items import W3SchoolItem
5
6class W3schoolSpider(Spider):
7   name = 'w3school'
8   allowed_domains = ["w3school.com.cn"]
9   start_urls = ['http://www.w3school.com.cn/']
10
11  def parse(self,response):
12      sel = Selector(response)
13      sites = sel.xpath('//div[@id="navfirst"]/ul[1]/li')#找到id=navfirst的div,找到其中ul里面li里的信息。
14      items = []
15
16      for site in sites:
17          item = W3SchoolItem()#每个item都相当于一个字典
18
19          title = site.xpath('a/text()').extract()#提取<a></a>中间的内容
20          link = site.xpath('a/@href').extract()#提取<a>中href的内容
21          desc = site.xpath('a/@title').extract()#提取<a>中title的内容
22
23          item['title'] = [t.encode('utf-8') for t in title]
24          item['link'] = [l.encode('utf-8') for l in link]
25          item['desc'] = [d.encode('utf-8')for d in desc]
26
27          items.append(item)
28
29          log.msg("Appending item...",level = "INFO")
30      log.msg("Append done.",level = 'INFO')
31      return items
32
33

1
2
1  最后我们可以检验一下我们的劳动成果啦,哇咔咔,先进入w3school文件运行下列的代码就ok了。
2

1
2
1scrapy crawl w3school
2

1
2
1  之后文件夹中会出现一个W3School_data.json的文件里面的内容就是。其实你也可以抓取其他的东西,只要更改xpath的内容就ok了。
2

1
2
3
4
5
6
7
8
9
1{"title": ["HTML 系列教程"], "link": ["/h.asp"], "desc": ["HTML 系列教程"]}
2{"title": ["浏览器脚本"], "link": ["/b.asp"], "desc": ["浏览器脚本教程"]}
3{"title": ["服务器脚本"], "link": ["/s.asp"], "desc": ["服务器脚本教程"]}
4{"title": ["ASP.NET 教程"], "link": ["/d.asp"], "desc": ["ASP.NET 教程"]}
5{"title": ["XML 系列教程"], "link": ["/x.asp"], "desc": ["XML 系列教程"]}
6{"title": ["Web Services 系列教程"], "link": ["/ws.asp"], "desc": ["Web Services 系列教程"]}
7{"title": ["建站手册"], "link": ["/w.asp"], "desc": ["建站手册"]}
8
9

给TA打赏
共{{data.count}}人
人已打赏
安全经验

职场中的那些话那些事

2021-9-24 20:41:29

安全经验

Kafka常用命令

2021-11-28 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索