Scrapy学习笔记
目标
使用Scrapy爬虫框架对获取网站新闻数据。
爬虫目标网站:http://tech.163.com
提取内容:
- url 新闻地址
- source 新闻来源
- title 新闻标题
- editor 新闻编辑
- time 新闻时间
- content 新闻正文内容
内容存储方式:
- 文件
- 数据库
代码
- 爬虫框架文件:
scrapy startproject NewsSpiderMan // 创建代码
结果:
├── NewsSpiderMan
│ ├── DmozSpider // 自建目录,存放针对DOMZ网站的爬虫类
│ │ ├── init.py
│ │ └── dmoz_spider.py
│ ├── NewsSpider // 自建目录,存放针对新闻的爬虫类
│ │ ├── NewsSpider.py
│ │ ├── NewsSpider.pyc
│ │ ├── init.py
│ │ └── init.pyc
│ ├── init.py
│ ├── init.pyc
│ ├── items.py // 爬虫提取内容设定
│ ├── items.pyc
│ ├── pipelines.py // 爬到数据后使用ITEM PIPELINE过滤处理数据并存放
│ ├── pipelines.pyc
│ ├── settings.py // 爬虫框架下配置
│ └── settings.pyc
├── README.md
├── news.txt // 爬虫结果
└── scrapy.cfg
GITHUB: https://github.com/chenxilinsidney/ScrapyNews
运行方式:scrapy crawl news163spider
爬虫类
#!/usr/bin/env python
# -*-encoding:UTF-8-*-
from NewsSpiderMan.items import NewsItem
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class NewsSpider(CrawlSpider):
name = "news163spider"
allowed_domains = ["tech.163.com"]
start_urls = ["http://tech.163.com"]
rules = [
Rule(LinkExtractor(allow='tech.163.com/16/.*\.html'),
follow=True, callback='parse_item')
]
def parse_item(self, response):
item = NewsItem()
item['url'] = [response.url]
item['source'] =\
response.xpath('//a[@id="ne_article_source"]/text()').\
extract()
item['title'] =\
response.xpath('//div[@class="post_content_main"]/h1/text()').\
extract()
item['editor'] =\
response.xpath('//span[@class="ep-editor"]/text()').\
extract()
item['time'] =\
response.xpath('//div[@class="post_time_source"]/text()').\
extract()
item['content'] =\
response.xpath('//div[@class="post_text"]/p/text()').\
extract()
for key in item:
for data in item[key]:
self.logger.debug("item %s value %s" % (key, data))
return item
# def parse_start_url(self, response):
# log.start()
# log.msg(str(response.xpath('//a/@href')))
# return response.xpath('//a/@href')
关键点:
1. name 标识一个爬虫,框架调用时使用(如命令:scrapy crawl news163spider)
2. start_urls 初始爬虫目标网站
3. Rule 爬虫规则
4. parse_item 结构化内容提取方法实现