新建项目
scrapy startproject news
items.py
打开scrapy框架自动创建的items.py
items.py
修改items.py
import scrapy # 导入scrapy模块
class NewsItem(scrapy.Item): # 定义爬虫项目类
# define the fields for your item here like:
# name = scrapy.Field()
news_thread = scrapy.Field() # 新闻线索,独立的ID
news_title = scrapy.Field() # 新闻标题
news_url = scrapy.Field() # 新闻url
news_time = scrapy.Field() # 新闻时间
news_source = scrapy.Field() # 新闻来源
source_url = scrapy.Field() # 来源链接
news_body = scrapy.Field() # 新闻内容
定义spider
在项目根目录运行命令行命令(注意是否已经cd news进入到项目根目录):
scrapy genspider -t crawl news163 news.163.com
补充知识点:selectors选择器
支持xpath和css,其中css选择器之前的爬虫案例中介绍过了,这里是补充xpath的操作,xpath语法如下
/html/head/title
/html/head/title/text()
//td (深度提取的话就是两个/)
//div[@class=‘mine’]
分析网页内容
在谷歌chrome浏览器下,打在网页新闻的网站,选择查看源代码,确认我们可以获取到itmes.py文件的内容(其实那里面的要获取的就是查看了网页源代码之后确定可以获取的)
确认标题、时间、url、来源url和内容可以通过检查和标签对应上
修改spider下创建的爬虫文件
导入包
打开创建的爬虫模板,进行代码的编写,除了导入系统自动创建的三个库,我们还需要导入news.items(这里就涉及到了包的概念了,最开始说的–init–.py文件存在说明这个文件夹就是一个包可以直接导入,不需要安装)
# -*- coding: utf-8 -*-
import scrapy # 导入scrapy模块
from scrapy.linkextractors import LinkExtractor # 导入链接提取器
from scrapy.spiders import CrawlSpider, Rule # 导入爬行蜘蛛,规则
from news.items import NewsItem # 从news/items.py文件中导入NewsItem类
注意:使用的类ExampleSpider一定要继承自CrawlSpider,因为最开始我们创建的就是一个‘crawl’的爬虫模板,对应上
class News163Spider(CrawlSpider): # 定义爬虫类名
name = 'news163' # 赋值名字
allowed_domains = ['news.163.com'] # 允许范围
start_urls = ['http://news.163.com/'] # 开始链接
rules = (
Rule(LinkExtractor(allow=r'https://news.163.com/20/0712/13/\d+/.*?html'), callback='parse_item', follow=True),
) # url爬取规则
注意, callback不要用parse! 把自动生成的parse删掉
url爬取规则
rules = (
Rule(LinkExtractor(allow=r'https://news.163.com/20/0712/13/\d+/.*?html'), callback='parse_item', follow=True),
) # url爬取规则
测试命令:
scrapy crawl news163
parse_item()是我们的回调函数
def parse_item(self, response): # 定义分析项目
item = NewsItem() # 实例化对象
item['news_thread'] = response.url.strip