欢迎来到天天文库
浏览记录
ID:12738747
大小:615.21 KB
页数:7页
时间:2018-07-18
《爬虫学习之基于scrapy的网络爬虫》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、爬虫学习之基于Scrapy的网络爬虫 建立目标 同样在做任何事情之前都需要明确目标,那这次我们的目标是爬取一些技术性的文章并存储到数据库中。这就需要有目标网址和数据库结构,数据库我们选择使用MySql,目标网站我们找了一个叫脚本之家的内容站。我们这里首先准备好一张用于存储文章的表结构: CREATETABLE`articles`( `id`mediumint(8)AUTO_INCREMENTNOTNULL, `title`varchar(255)DEFAULTNULL, `content`longtext, `add_date`int(11)DEFAULT
2、0, `hits`int(11)DEFAULT'0', `origin`varchar(500)DEFAULT'', `tags`varchar(45)DEFAULT'', PRIMARYKEY(`id`), KEY`add_date`(`add_date`) )ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_unicode_ci; 分析目标结构 这里我们首先需要爬取得入口是“网络编程”这个节点,主入口网址为(http://www.jb51.net/list/index_1.htm)打开这个网站我们通过Chrom
3、e或者其他浏览器的查看元素来分析当前页面的HTML语义结构,如下图所示: 从图中红色框线的部分可以看出,这里是我们需要在“网络编程”这个节点下需要提取的所有文章的主分类入口,通过这些入口可以进去到不同文章分类的列表中。所以根据初步结构分析,我们得出本次爬虫的爬取路线为: 从主入口进去->提取当前入口中的所有分类->通过分类入口进入到分类列表->通过列表进入到文章页 分类入口确定了接下来看看我们的分类列表,随意点开一个分类入口,打开列表如下图所示: 这里我框出了两个主要部分,第一个是文章的标题,第二个是分页,文章对应的URL就是我们接下来需要爬取文章内容的入口,这
4、里需要注意的是分页的处理,通过分页的最后一页我们可以知道当前这类列表共有多少页文章。结合以上分析我们基本确定了本次爬虫的各个路线入口,接下来我们就开始通过程序来实现本次的目标。 实现爬虫 在实现爬虫之前我们通过一张图来对Scrapy有个基本的认识,为了保持本章内容的简洁性,我们这里暂时不会讨论ItemPipeline部分,Scrapy架构图如下所示(图片来自网络): 从图中可以很清晰的看到Scrapy所包含的几大块,下面我们通过代码来演示我们所用到的基础功能部分。 主要依赖第三方库: web.pyweb框架,这里只用到了database部分,将来会用来进行内容
5、展示 scrapy爬虫框架,这里只用到了最基本的内容提取 这里还会用到一些xpath相关知识,请自行Google了解xpath语法 #-*-coding:utf-8-*- '''bysudorm-rfhttp://imchenkun.com''' importscrapy fromscrapy.httpimportRequest importweb importtime db=web.database(dbn='mysql',host='127.0.0.1',db='imchenkun',user='root',pw='root') #允许的站点域
6、 allow_domain="jb51.net" base_url="http://www.jb51.net" #列表页 list_url="http://www.jb51.net/list/list_%d_%d.htm" #列表分页 list_page=1 #文章页 crawl_url="http://www.jb51.net/article/%d.htm" classJB51Spider(scrapy.Spider): name="jb51" start_urls=[ "http://www.jb51.net/list/index_1.htm"
7、 ] cate_list=[] defparse(self,response): cate_id=response.selector.xpath('//div[@class="index_borclearfix"]/div[@class="index_con"]/span/a/@href').re('(\\d+)')[::2] foridincate_id: cate_url=list_url%(int(id),1) yieldRequest(cate_url,callback=self.parse_page) def
此文档下载收益归作者所有