- 安装
pip install Scrapy pip install win32api
安装过程中可能会遇到的错误详见:https://blog.csdn.net/Small_Wchen/article/details/77750849
-
创建一个scrapy项目 如淘宝
scrapy startproject myproject
-
创建第一个spiders文件
cd myproject scrapy genspider baiduSpider baidu.com
-
示例:爬取菜鸟教程里的数据
#spiders文件 import scrapy from myspiders.items import RunoobItem class RunoobspiderSpider(scrapy.Spider): name = 'runoobSpider' allowed_domains = ['runoob.com'] start_urls = ['http://www.runoob.com/'] def parse(self, response): #用xpath方法获取想要的标签 links=response.xpath('//div[@class="col nav"]/ul/li/a') items=[] for link in links: #创建一个item对象 item=RunoobItem() #取到的是数组,所以[0]取到字符串,也可以用extract_first() item['href']=link.xpath('./@href')[0].extract() item['title']=link.xpath('./text()')[0].extract() items.append(item) return items #在items里创建一个新类 from scrapy.item import Item,Field class RunoobItem(scrapy.Item): href=Field() #域href=Field() #域 title=Field()title=Field()
-
css,xpath,re都可以用来解析response
#css选择器取属性值 标签名::attr(属性名) #xpath取属性名 @href
-
将解析完成的数据保存
#控制台输入 #运行文件,baiduSpider是你的name scrapy crawl baiduSpider #-o后面是保存数据的文件名 scrapy crawl baiduSpider -o baidu.json
-
测试工具
#首先安装iPython pip install iPathon #进入文件 cd myproject #url是你要测试的网址 scrapy shell url #开始测试 response.xpath('')
-
爬取多页信息
import scrapy from myspiders.items import mingyanItem class Mingyan2Spider(scrapy.Spider): name = 'mingyan2' allowed_domains = ['lab.scrapyd.cn'] start_urls = ['http://lab.scrapyd.cn/page/1/'] def parse(self, response): div=response.xpath('//div[@class="quote post"]') for d in div: #创建一个item item=mingyanItem() #文本 item['text']=d.xpath('./span[@class="text"]/text()')[0].extract() #作者 item['author']=d.xpath('./span/small/text()')[0].extract() #链接 item['href']=d.xpath('./span/a/@href')[0].extract() yield item #获取下一页的链接 next_page=response.xpath('//li[@class="next"]/a/@href')[0].extract() #链接是否存在 if next_page: #把链接改为完整路径 next_page = response.urljoin(next_page) #回调 yield scrapy.Request(next_page,callback=self.parse) return item
-
爬取多页信息
name = '51jobSpider' allowed_domains = ['51job.com'] start_urls = [] #第一种写法 url='https://search.51job.com/list/070300,000000,0000,00,9,99,python,2,1.html' url='https://search.51job.com/list/070300,000000,0000,00,9,99,' for i in range(1,3): url = 'https://search.51job.com/list/070300,000000,0000,00,9,99,' query["page"]='2.{0}.html'.format(i) url=url+parse.urlencode(query) url=parse.quote(url,safe=string.printable) start_urls.append(url) #第二种写法 def start_requests(self): query = { "q":"手机", "s":0 } for i in range(2): url = "https://s.taobao.com/search?" query["s"]=i*48 url=url+parse.urlencode(query) url=parse.quote(url,safe=string.printable) yield scrapy.FormRequest(url=url,callback=self.parse)
-
全局命令
|命令 |作用 |
|------------|------------------|
|startproject|创建项目 |
|genspider |创建蜘蛛 |
|settings |查看设置了那些参数 |
|runspider |基于文件运行py文件 |
|shell |调试用 |
|fetch |调试用,用于调试淘宝这类异步传输界面|
|view |调试用 |
|version |查看scrapy的版本 | -
局部命令
|命令|作用 |
|–|--|
|crawl |运行蜘蛛 |
|check|检查蜘蛛|
|list|蜘蛛的列表|
|edit| |
|parse| |
|bench| |