<h2>创建Scrapy项目<h2>
首先打开命令行,进入你想存放scrapy项目的目录下,输入以下命令
scrapy startproject firstscrapy
将会创建firstscrapy文件夹,其目录结构如下:
firstscrapy/
scrapy.cfg # 部署配置文件
coolscrapy/ # Python模块,你所有的代码都放这里面
__init__.py
items.py # Item定义文件
pipelines.py # pipelines定义文件
settings.py # 配置文件
spiders/ # 所有爬虫spider都放这个文件夹下面
__init__.py
...
<h2>Item讲解与创建<h2>
Item含义:我们爬取网页后得到的数据需要保存,而Item对象是一种简单的容器,可以保存我们爬取得到的数据,让我们可以以字典格式将数据进行保存
<h3>Item实例<h3>
我们通过创建一个scrapy.Item类,并定义它的类型为scrapy.Field的属性,我们准备将虎嗅网新闻列表的名称、链接地址和摘要爬取下来。
import scrapy
class HuxiuItem(scrapy.Item):
title = scrapy.Field() # 标题
link = scrapy.Field() # 链接
desc = scrapy.Field() # 简述
posttime = scrapy.Field() # 发布时间
<h2>第一个Spider<h2>
在这个类中我们定义了一个初始化的url下载列表,以及怎样跟踪链接,如何解析页面内容来提取Item。
- name: Spider名称,必须是唯一的
- start_urls: 初始化下载链接URL
- parse(): 用来解析下载后的Response对象,该对象也是这个方法的唯一参数。它负责解析返回页面数据并提取出相应的Item(返回Item对象),还有其他合法的链接URL(返回Request对象)。
我们在firstscrapy/spiders文件夹下面新建huxiu_spider.py,内容如下:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: sample
Desc :
"""
from firstscrapy.items import HuxiuItem
import scrapy
class HuxiuSpider(scrapy.Spider):
name = "huxiu"
allowed_domains = ["huxiu.com"]
start_urls = [
"http://www.huxiu.com/index.php"
]
def parse(self, response):
for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):
item = HuxiuItem()
item['title'] = sel.xpath('h3/a/text()')[0].extract()
item['link'] = sel.xpath('h3/a/@href')[0].extract()
url = response.urljoin(item['link'])
item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()
print(item['title'],item['link'],item['desc'])
<h2>运行爬虫<h2>
在根目录执行下面的命令,其中huxiu是你定义的spider名字:
scrapy crawl huxiu
<h2>处理链接<h2>
如果想继续跟踪每个新闻链接进去,看看它的详细内容的话,那么可以在parse()方法中返回一个Request对象,然后注册一个回调函数来解析新闻详情。
from firstscrapy.items import HuxiuItem
import scrapy
class HuxiuSpider(scrapy.Spider):
name = "huxiu"
allowed_domains = ["huxiu.com"]
start_urls = [
"http://www.huxiu.com/index.php"
]
def parse(self, response):
for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):
item = HuxiuItem()
item['title'] = sel.xpath('h3/a/text()')[0].extract()
item['link'] = sel.xpath('h3/a/@href')[0].extract()
url = response.urljoin(item['link'])
item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()
# print(item['title'],item['link'],item['desc'])
yield scrapy.Request(url, callback=self.parse_article)
def parse_article(self, response):
detail = response.xpath('//div[@class="article-wrap"]')
item = HuxiuItem()
item['title'] = detail.xpath('h1/text()')[0].extract()
item['link'] = response.url
item['posttime'] = detail.xpath(
'div[@class="article-author"]/span[@class="article-time"]/text()')[0].extract()
print(item['title'],item['link'],item['posttime'])
yield item
最后我们可以再次运行爬虫