盒子
盒子
文章目录
  1. I、新建scrapy项目
  2. II、新建spider
    1. ① 进入项目
    2. ② 新建spider
  3. III、编写代码
    1. ① item.py
    2. ② ScrapyDocSpider.py
  4. IV、运行程序

抓取scrapy中文文档(我的第一个爬虫)

I、新建scrapy项目

Tips:本文档默认大家已经安装scripy,如果还没,请参考Installation guide

1
scrapy startproject scrapyDoc

II、新建spider

① 进入项目

1
cd scrapyDoc

② 新建spider

1
scrapy genspider ScrapyDoc scrapy-chs.readthedocs.org

即: name = ‘ScrapyDoc’
allowed_domains = [‘scrapy-chs.readthedocs.org’]

III、编写代码

① item.py

1
2
3
4
5
6
7
8
9
10
11
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/topics/items.html
from scrapy.item import Item, Field
class ScrapydocItem(Item):
title = Field()
link = Field()
url = Field()

② ScrapyDocSpider.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from ScrapyDoc.items import ScrapydocItem
import os
#设置默认编码
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class ScrapyDocSpider(BaseSpider):
name = 'ScrapyDoc'
allowed_domains = ['scrapy-chs.readthedocs.org']
start_urls = ['http://scrapy-chs.readthedocs.org/zh_CN/latest']
def parse(self,response):
if response.url.split("/")[-1] == '':
filename = response.url.split("/")[-2]
else :
dirname = response.url.split("/")[-2]
#判断是否有此目录,如果没有就新建
if os.path.isdir(dirname) == False:
os.mkdir(dirname)
filename = '/'.join(response.url.split("/")[-2:])
#保存文件
open(filename,'wb').write(response.body)
sel = HtmlXPathSelector(response)
sites = sel.select('//li[@class="toctree-l1"]')
for site in sites:
item = ScrapydocItem()
item['title'] = site.select('a/text()').extract()
#生成连接 begin ,因为从页面提取的连接都是相对地址
link = site.select('a/@href').extract()[0]
url = response.url
#地址形式是否为 ../spiders.html 这种形式,需要回到上级地址
if link.split('/')[0] == '..':
url2 = '/'.join(url.split('/')[0:-2]) + '/' + '/'.join(link.split('/')[1:])
else:
url2 = '/'.join(url.split('/')[0:-1]) + '/' + link
item['link'] = [url2]
#生成连接 end
yield item
#返回多个request
yield Request(url=url2,callback=self.parse)
return

IV、运行程序

  1. 回到scrapy项目主目录
  2. 新建一个文件夹(我习惯将所有下载的文件保存在一个单独文件夹下)

    1
    mkdir doc
  3. 进入doc文件夹

    1
    cd doc
  4. 运行程序

    1
    scrapy crawl ScrapyDoc
  5. 现在终于将scrapy中文文档保存在本地了,不过提取到的item还没存储,可以输入如下命令行保存item

    1
    scrapy crawl ScrapyDoc -o s.json -t json
支持一下
走过的,路过的,请支持一下我 n(*≧▽≦*)n