上一篇文章已经说了怎么安装sarapy,这次就直接拿新浪试试!!
安装sprapy:↓
https://www.jianshu.com/p/ddf57836d625
CrwlSpider允许用户根据一定的URl规则提取跟进的链接,因为一般的网站设计URL都符合一定的规则,CrwlSpider正式利用这种URl构造跟进链接。
1、rules:
rules是规则对象的集合,也就是说爬取规则是在rules中定义,可定义多条规则,如果多个Rule匹配了相同的链接,则根据定义顺序,使用第一个。
2、爬取规则:
link_extractor被称为链接提取器,用它来定义具体的爬取规则,也就是说如何从爬取的页面提取链接并且可方便的过滤选项:
①. allow:值为正则表达式或正则表达式列表,当URL匹配时提取这个规则,它为空或者没有指定,将匹配所有连接。
②. deny值为正则表达式或正则表达式列表,URL匹配时不提取,优先于allow,它为空或者没有指定,将匹配所有连接。
废话不多说,“翠花,上代码。。。”
开始spider:
1、首先建立项目,使用crawl模板生成spider文件
scrapy startproject pachong6 #建立项目
cd pachong6 #进入项目
scrapy genspider -t crawl sina sina.com #使用crawl 生成spider文件
查看项目内文件,已经全部生成
2、定义爬取数据,打开项目内items文件,定义爬取项
(为定义演示用,只爬取三项:新闻标题,发布时间和新闻url)
注意:使用文本编辑器编辑完内容时,记得TAB转为空格
3、分析新浪新闻
https://www.sina.com.cn/
发现每条新闻的链接都是
开头:news.sina.com.cn****
结尾:(7位数字).shtml
知道了新浪新闻的URl规则,就好爬了
4、编写spider文件
生成的项目中spiders文件夹下sina.py
比如我的:
pachong6/spiders/sina.py
打开这个文件会发现,scrapy已经帮我们把大部分都生成好了,只要自己再稍微改动下就好了!
其中:
name=定义的爬虫的名字
allowed_domains=定义爬取的域名,不在此域名中会被过滤
start_urls=默认爬取的地址,爬虫默认从start_urls爬取
5、开始编写爬虫:
①. 在生成的文件中改动相关内容
②. 最核心的一步,定义链接提取规则
follow默认为True,
follow是一个布尔值,指定这个规则从response提取的链接是否跟进,
也就是说在你打开的这个新闻页面下还有别的新闻链接并且url和规则定义的匹配,那么爬虫会继续跟进这个url,爬取你想要的内容,知道爬取完整个网站。
至此,短短几行就完成了整个新浪新闻的爬取
人生苦短,我用py
6、运行爬虫文件
在含有‘scrapy.cfg’文件路径下,也就是项目的根目录,打开cmd
输入命令
scrapy list #检查是否有格式错误
继续执行命令
scrapy crawl sina -o sina.csv #运行爬虫并保存到csv文件或者json文件(sina.json)
爬虫正常运行,爬取到数据已经在下方输出了
查看生成的csv文件,保存正确。
注:如果保存csv文件未乱码,打开爬虫项目中settings.py
在其中添加
FEED_EXPORT_ENCODING = "gb18030" #防止写入csv乱码
保存文件,再次运行爬虫就不会乱码了。
settings.py是爬虫框架的设置文件,请求头和间隔时间都在这里设置。
如果爬取到的内容为空,查看是否Xpath是否正确
项目根目录中,打开cmd,输入
scrapy shell (url地址)
最后,附完整代码
items文件
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class Pachong4Item(scrapy.Item):
title = scrapy.Field()
data = scrapy.Field()
content_url = scrapy.Field()
sina文件
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from pachong4.items import Pachong4Item
class SinaSpider(CrawlSpider):
name = 'sina'
allowed_domains = ['sina.com.cn']
start_urls = ['https://www.sina.com.cn/']
rules = (
Rule(LinkExtractor(allow=r'https://news.sina.com.cn/.*.shtml?'), callback='parse_item',
follow=True),
)
def parse_item(self, response):
item = Pachong4Item()
item['title'] = response.xpath('/html/body/div[2]/h1/text()').extract_first()
item['data'] = response.xpath('//*[@id="top_bar"]/div/div[2]/span/text()').extract_first()
item['content_url'] = response.xpath('/html/head/meta[10]/@content').extract_first()
return item
只需要几条规则,就可以爬取整个网站,是不是特别简单?
已经非常接近通用爬虫了!!!