scrapy爬虫笔记(一)

最近因为需要爬取豆瓣的排名250的榜单,所以打算用scrapy去爬取,现将学习的笔记整理为一篇笔记。
这篇笔记是针对爬取豆瓣的榜单的,所以会偏向实践多一点,理论不会详细论述。利用scrapy爬取的步骤主要有三大步:
1、新建scrapy的项目
2、确定需要爬取的目标,编写好items模块
3、这是最重要的一步,写爬虫的程序,也就是写好spider的模块

一、首先第一步,新建scrapy需要在命令行输入:

scrapy startproject 项目名

然后就会在你的根目录下自动生成一个项目,你需要编写那个模块就可以在哪个模块下面编写代码了。

二、确定好你所需要爬取的目标,比如说我现在要爬取豆瓣排名榜单上的书名,作者名和评分这三个,然后我就可以在items这个模块下编写好我需要的对象。具体步骤如下:
进入items模块,import scrapy 的包
新建一个类,这个类继承了scrapy包里面的Items这个类
在这个类下面,用scrapy里面的Field方法去声明你需要爬取的对象,Field方法返回的是一个字典,用来存放你爬取以后的数据
具体代码如下:

class TutorialItem(scrapy.Item):
  # define the fields for your item here like:
# name = scrapy.Field()
BookName = scrapy.Field()
Author = scrapy.Field()
scores = scrapy.Field()

三、编写爬虫程序。进入到spiders这个目录下,新建一个py文件,在里面编写你的爬虫程序。这里面也有主要的几步:

1、新建一个类,这个类包含三块主要的部分:name、start_urls、parse方法,name是这个爬虫程序的名字,必须要命名好,在等下启动程序的时候就需要用到,start_urls是需要爬取网站的url ,parse方法是需要用来爬取的方法,他返回一个response对象,而这个response就是你爬取到网页的全部内容。

2、下面详细说明parse的方法:parse方法具体是使用了request的方法把网站的内容爬取下来,然后利用scrapy的选择器把你所需要的内容选择下来。scrapy的选择器有xpath和css两个。这里我用的是xpath,所以我具体记录一下xpath的用法,css的用法可以参考scrapy的官网文档。xpath可以跟据网站上的HTML的符合匹配到你所需要找的内容的,如我在爬取豆瓣网站上的书名的时候,就可以用xpath匹配到书名是在(a/@title)这个属性下。

ScreenClip.png

匹配到书名之后,再调用extract()方法将他匹配到选择匹配到的第一个元素,就是我们想要得到的书名了。建议在找匹配信息的HTML的符合的时候,使用谷歌的浏览器,这会让你很容易就能找到。xpath的用法也简单,下面列举几个:
1.‘/’是匹配到根节点,而‘//’从匹配当前的节点中选择文档的节点
2.‘@’是选择属性。而‘@*’就是选择所有该属性的元素
......
详细可以参考w3schoolhttp://www.w3school.com.cn/xpath/xpath_syntax.asp,列举得很详细
具体代码如下

   def parse(self,response):
#将全部图书的项目取出
sites =response.xpath('//tr[@class="item"]') 

将每一个图书item里面分别取出标题,作者和评分

for site in sites:
  book = TutorialItem()
  book['BookName'] = site.xpath('//td[2]/div[1]/a/@title').extract()[0]
  book['Author'] = site.xpath('//td[2]/p[1]/text()').extract()[0]
  book['scores'] =site.xpath('//td[2]/div[2]/span[@class="rating_nums"]/text()').extract()[0] 

爬取一页的步骤大概就是如此,要是我需要爬取多页又是如何操作呢?我们需要再写一个parse的方法,用这个方法去分析出网页底下页面数的url,再调用上面的爬取一页的代码块依次遍历每一页的url即可。

这里解释一下,parse方法可以有两种返回值,一种是直接返回response对象,那么就可以会储存到items的字典里面,还有一种就是可以返回一个request请求,去解析你所要继续爬取的url,即可爬取所有n页的页面了
当然,这个方法也可以用来爬取链接里面的链接的内容,道理跟爬取所有页是一样的。代码如下:
#爬取当前页,并返回其他页面的url
def parse(self,response):
#返回请求去解析当前页
yield scrapy.Request(response.url,callback=self.parse_page)

#遍历取得第n页的url

for site in response.xpath('//div[@class="paginator"]/a'): 
  page = site.xpath('@href').extract()[0] 
  yield scrapy.Request(page,callback = self.parse_page)  #返回请求解析这些url的页面,并调用下面的parse_page函数去解析


#解析单页的函数

def parse_page(self,response):

sites =response.xpath('//tr[@class="item"]')

for site in sites:
  book = TutorialItem() #book是我们储存爬取内容的实例
  #将我们爬取到的书名,作者和评分分别放到我们开始声明的字典里面
  book['BookName'] = site.xpath('//td[2]/div[1]/a/@title').extract()[0]
  book['Author'] = site.xpath('//td[2]/p[1]/text()').extract()[0]
  book['scores'] = site.xpath('//td[2]/div[2]/span[@class="rating_nums"]/text()').extract()[0]

return book

三、还有一步也是很重要的,就是设置’user agent’。’user agent’ 进行对爬虫进行伪装,伪装成为浏览器浏览的活动。具体操作如下是:在settings里面输入

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

到这里,就可以在命令行运行运行你的爬虫了,首先cd 进入存放你的scrapy项目的路径,然后输入

scrapy crawl ‘name的值’

就可以运行你的爬虫了,一个简单的轻量级的爬虫就完成了,
当然scrapy能做的远不止这些,还可以设置爬取的速度,并行,多线程等等,这些就留着下次再记录。

参考:
1.scrapy的官网文档
2.http://www.hulufei.com/post/Some-Experiences-Of-Using-Scrapy

你可能感兴趣的:(scrapy爬虫笔记(一))