Scrapy 爬虫入门 +实战

Posted 北漂的雷子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy 爬虫入门 +实战相关的知识,希望对你有一定的参考价值。

 

 

 爬虫,其实很早就有涉及到这个点,但是一直没有深入,今天来搞爬虫。选择了,scrapy这个框架

http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html 入门教程

其实安装还是很简单的,我们可以直接pip install scrapy

如果报错也可以去下载https://pypi.python.org/pypi/Scrapy

Scrapy-1.4.0-py2.py3-none-any.whl (md5)进行安装,安装报错,需要去下载提示的库,

Twisted安装:

下载http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

然后安装

安装PyWin32

从官方网站下载对应版本的安装包即可,链接为:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/

下图显示了Scrapy的大体架构,

 

二、组件

1、Scrapy Engine(Scrapy引擎)

Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。

2、Scheduler(调度)

调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。

3、Downloader(下载器)

下载器的主要职责是抓取网页并将网页内容返还给蜘蛛( Spiders)。

4、Spiders(蜘蛛)

蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。

蜘蛛的整个抓取流程(周期)是这样的:

首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。

在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。

在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。

最后,从蜘蛛返回的项目通常会进驻到项目管道。

5、Item Pipeline(项目管道)

项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。

项目管道通常执行的过程有:

清洗HTML数据
验证解析到的数据(检查项目是否包含必要的字段)
检查是否是重复数据(如果重复就删除)
将解析到的数据存储到数据库中

6、Downloader middlewares(下载器中间件)

下载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。它提供了一个自定义的代码的方式来拓展Scrapy的功能。下载中间器是一个处理请求和响应的钩子框架。他是轻量级的,对Scrapy尽享全局控制的底层的系统。

7、Spider middlewares(蜘蛛中间件)

蜘蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。它提供一个自定义代码的方式来拓展Scrapy的功能。蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目。

8、Scheduler middlewares(调度中间件)

调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是处从Scrapy引擎发送到调度的请求和响应。他提供了一个自定义的代码来拓展Scrapy的功能。

我们安装后可以去建立一个工程,我起名叫做baidu

scrapy startproject baidu

目录结构

scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py: 项目中的item文件.
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.
tutorial/spiders/: 放置spider代码的目录.

那么开始一个爬虫

我们去分析下这个网站 https://movie.douban.com/top250


我们可以看到,界面所有的都是在ol的标签下,元素的class也是唯一的, 那么我们可以定位到这里,去找到所有的电影的一个集合
xptach是//ol[@class="grid_view"]/li
那么我们来分析下下面的电影



 

 


我们可以看到 我们想要获取的元素是很简单的,都是好获取的元素,
那么我们来顶一下我们要获取的,我们在item.py来定义
    ranking=scrapy.Field()
    movie_name=scrapy.Field() #电影名称
    score=scrapy.Field() #分数
    score_num=scrapy.Field()#评分人数
    daoyan=scrapy.Field()#导演,演员
    bieming=scrapy.Field()
    url=scrapy.Field()#url地址
几乎我们可以看到我们想要的元素都可以得到,
那么我们来组织我们的代码
from baidu.items import BaiduItem
from scrapy import Request
import re
class XiaoHuarSpider(scrapy.Spider):
	name = \'douban_movie_top250\'
	start_urls=[
		 \'https://movie.douban.com/top250\']
		
	def parse(self, response):
		item = BaiduItem()
		movies = response.xpath(\'//ol[@class="grid_view"]/li\')
		for movie in movies:
			item[\'ranking\'] = movie.xpath(\'.//div[@class="pic"]/em/text()\').extract()[0]
			item[\'movie_name\'] = movie.xpath(\'.//div[@class="hd"]/a/span[1]/text()\').extract()[0]
			item[\'score\'] = movie.xpath(\'.//div[@class="star"]/span[@class="rating_num"]/text()\').extract()[0]
			item[\'score_num\'] = movie.xpath(\'.//div[@class="star"]/span/text()\').re(\'(\\d+)人评价\')[0]
			item[\'daoyan\']=movie.xpath(\'.//div[@class="bd"]/p/text()\').extract()[0]
			item[\'bieming\']=movie.xpath(\'.//div[@class="bd"]/p[@class="quote"]/span/text()\').extract()[0]
			item[\'url\']=movie.xpath(\'.//div[@class="hd"]/a/@href\').extract()[0]
			yield item

 

我们来在命令行来跑下我们的代码
scrapy crawl douban_movie_top250 --logfile=test.log -o douban_movie_top250.json -t json

我们可以看到是没有获取到数据了,只有log日志

翻阅资料发现有人说着可能是被禁止了,那么我们来修改修改,伪造下
加个headers吧
class XiaoHuarSpider(scrapy.Spider):
	name = \'douban_movie_top250\'
	headers = {\'User-Agent\': \'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\',}
	def start_requests(self):
		url = \'https://movie.douban.com/top250\'
		yield Request(url, headers=self.headers)
	def parse(self, response):
		item = BaiduItem()
		movies = response.xpath(\'//ol[@class="grid_view"]/li\')
		for movie in movies:
			item[\'ranking\'] = movie.xpath(\'.//div[@class="pic"]/em/text()\').extract()[0]
			item[\'movie_name\'] = movie.xpath(\'.//div[@class="hd"]/a/span[1]/text()\').extract()[0]
			item[\'score\'] = movie.xpath(\'.//div[@class="star"]/span[@class="rating_num"]/text()\').extract()[0]
			item[\'score_num\'] = movie.xpath(\'.//div[@class="star"]/span/text()\').re(\'(\\d+)人评价\')[0]
			item[\'daoyan\']=movie.xpath(\'.//div[@class="bd"]/p/text()\').extract()
			item[\'bieming\']=movie.xpath(\'.//div[@class="bd"]/p[@class="quote"]/span/text()\').extract()[0]
			item[\'url\']=movie.xpath(\'.//div[@class="hd"]/a/@href\').extract()[0]
			yield item

那么我们再来运行下我们的代码

看下我们的douba.csv

 

在来看看我们的日志模块:

 

 我们的日志也可以正常的打印了,那么我们来看看,我们的数据似乎少很多,只有第一页的,那么我们去分析下我们的页面

 

似乎我们明白了什么
那么,我们来改进下我们的代码。
增加下面代码
next_url=response.xpath(\'//span[@class="next"]/a/@href\').extract()
		if next_url:
			next_url=\'https://movie.douban.com/top250\'+next_url[0]
			yield Request(next_url,headers=self.headers)

 那么我们再来爬取下我们的爬虫

单单看我们现在的数据文件大小,我们是成功的,那么我们来看下我们里面的内容

 

日志文件显示了很多之前没有爬取到的文章

 

爬虫其实也没有那么复杂,只要你在路上坚持了。




 

另外本人提供vip指导,python自动化,python学习上面,python做测试开发上面,我都会提供指导,vip终身有效,现价1500,联系qq:952943386,稍后会更新qq群,喜欢的朋友可以来,本人也是从一个不懂啥是python到现在能做东西,从15的2k到17的10k+都是辛酸泪,可以与大家一起共勉,提供思路,能够让你走的更远,我也是从白纸一张一步步走来,如果你是新毕业的学生这个也适合你,可以给你指导,但是我能做的就是带你,但是我不是培训班,没有提供就业的机会,我只会在有机会的时候给你推荐,学无止境,此时可能我只能教你一些测试,提供职业指导,我可能以后会带给你更多。

我是一个大专生,也是一个人奋斗到今天。



 



 

以上是关于Scrapy 爬虫入门 +实战的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy框架爬虫实战——从入门到放弃01

十分钟入门爬虫框架scrapy

SCRAPY爬虫框架入门实例

python爬虫入门Scrapy框架之CrawlSpider类

Python爬虫从入门到放弃之 Scrapy框架的架构和原理

Python爬虫实战,Scrapy实战,爬取旅行家游记信息