最近又要新写一个网站的爬虫,虽然写了好几个了,但每次写都要再来现看一遍资料,觉得还是有必要写一篇,记录一下。
一、编写步骤
1、新建工程目录
进入打算存储代码的目录中,命令行运行下列命令:
scrapy startproject 目录或爬虫名称
2、用pycharm打开此目录,可看到如下目录结构
3、items.py文件中定义item,主要是网页中要提取的一个单位数据元中包含的字段。
4、新建一个spider类,需要特别注意文件名称不能与工程名称相同,否则会导致文件内的引用出错(错误列表2)!
且定义以下三个属性:
name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
#coding=utf-8 import scrapy import sys reload(sys) sys.setdefaultencoding('utf-8') from alexaurl.items import AlexaurlItem from alexaurl.Logger import mylog class DmozSpider(scrapy.spiders.Spider): name = "alexaurl" allowed_domains = ["alexa.cn"] start_urls = [] urls = { "http://www.alexa.cn/siterank" : u'总榜' } for classify_url in urls: for j in range(1, 2): start_urls.append(classify_url+"/"+str(j)) def parse(self, response): province = '' for sel1 in response.xpath("//div[@class='siterank-list']/dl/dd/a[@class='on']"): province = sel1.xpath('text()').extract()[0] for sel in response.xpath("//div[@class='layout wrap']/dl/dd/ul//li"): item = AlexaurlItem() item['ranking'] = int(sel.xpath("div[@class='rank-index']/text()").extract()[0]) item[