本篇主要介绍对于一个爬虫框架的思考和,核心部件的介绍,以及常规的思考方法:
猜想
我们说的爬虫,一般至少要包含几个基本要素:
1.请求发送对象(sender,对于request的封装,防止被封)
2.解析文档对象(将请求的网页当作是html文档还是字符串)
3.承载所需要的解析对象(标准格式的数据承载者)
4.获取所需对象后的操作者 (得到对象后,是以文件形式保存还是存入数据库)
5.整个流程的错误处理者(整个流程的异常监控者)
验证
我们来看看Scrapy 提供了哪些核心的对象
基本概念
-
命令行工具(Command line tools)
-
学习用于管理Scrapy项目的命令行工具
-
Items
-
定义爬取的数据
-
Spiders
-
编写爬取网站的规则
-
选择器(Selectors)
-
使用XPath提取网页的数据
-
Scrapy终端(Scrapy shell)
-
在交互环境中测试提取数据的代码
-
Item Loaders
-
使用爬取到的数据填充item
-
Item Pipeline
-
后处理(Post-process),存储爬取的数据
-
Feed exports
-
以不同格式输出爬取数据到不同的存储端
-
Link Extractors
-
方便用于提取后续跟进链接的类。
refer from :https://scrapy-chs.readthedocs.org/zh_CN/0.24/
基本上我们所设想的对象Scrapy都会包含在里面了
爬取
我们知道,一般爬虫都是按如下规则来爬取数据的
输入目标网址=> 编写处理规则(正则表达式或者xpath语法)=>对得到的数据进行处理
Scrapy的做法如下:
1)新建一个项目
以命令行形式切换到需要将代码放置的文件夹下,然后输入如下命令:
scrapy startproject cnblogs
|
scrapy startproject cnblogs
|
文件夹下会生成一个cnblogs的文件下,切换到该文件夹下(记住切换)
Item.py就是我们所需要数据承载器
修改为如下代码:
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # http://doc.scrapy.org/en/latest/topics/items.html import scrapy from scrapy.item import Field,Item class CnblogsItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() Title = Field() TitleUrl = Field()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
from scrapy.item import Field,Item
class CnblogsItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
Title = Field()
TitleUrl = Field()
|
在Spider文件夹下添加BasicGroupSpider.py 修改为如下内容
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from cnblogs.items import CnblogsItem class CnblogsSpider(BaseSpider): name = "cnblogs" #spider的名字 allowed_domains = ["cnblogs.com"] start_urls = [ 'http://www.cnblogs.com/' ] #待抓取的列表 def parse(self, response): self.log("Fetch douban homepage page: %s" % response.url) hxs = HtmlXPathSelector(response) #authors = hxs.select('//a[@class="titlelnk"]') items = hxs.select('//a[contains(@class, "titlelnk")]') listitems = [] for author in items: #print author.select('text()').extract() item = CnblogsItem() #property item['Title'] = author.select('text()').extract() item['TitleUrl'] =author.select('@href').extract() listitems.append(item) return listitems
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
|
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from cnblogs.items import CnblogsItem
class CnblogsSpider(BaseSpider):
name = "cnblogs" #spider的名字
allowed_domains = ["cnblogs.com"]
start_urls = [
'http://www.cnblogs.com/'
] #待抓取的列表
def parse(self, response):
self.log("Fetch douban homepage page: %s" % response.url)
hxs = HtmlXPathSelector(response)
#authors = hxs.select('//a[@class="titlelnk"]')
items = hxs.select('//a[contains(@class, "titlelnk")]')
listitems = []
for author in items:
#print author.select('text()').extract()
item = CnblogsItem()
#property
item['Title'] = author.select('text()').extract()
item['TitleUrl'] =author.select('@href').extract()
listitems.append(item)
return listitems
|
OK ,回到第一步的命令台的界面,输入如下命令
scrapy crawl cnblogs --logfile=test.log -o cnblogs.json -t json
|
scrapy crawl cnblogs --logfile=test.log -o cnblogs.json -t json
|
结果
关于里面的代码功能,自己去理解吧,写过代码的人大致都了解。
====>DEMO下载<====
总结
本次主要分析了爬虫框架的大致构件,并验证了我们的猜想,关于python的爬虫框架有很多,不过像scrapy这样值得入手和研究的,比较少了,.net下的更少了。
文章来源: brucedone.com,作者:大鱼的鱼塘,版权归原作者所有,如需转载,请联系作者。
原文链接:brucedone.com/archives/145
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)