前言 说完理论,总要说说实战,下面说的就是爬取我的个人博客文章标题,链接,访问者等的实战内容
爬取前奏 我们在开始我们的爬虫之前,第一步要做的是什么?当然是分析网站,构思爬取全过程了。
所以,一开始说的就是爬取思路。
对我的Walks个人博客爬取思路:知道我们要爬取什么-》定位要爬取的元素-》访问文章页-》下载HTML-》提取目标数据-》处理爬取数据
代码实现和分析 Items.py 1 2 3 4 5 6 7 8 9 10 11 12 import scrapy #定义一个存储数据的类,用来存储数据 class MyblogcontentItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() #pass #要存储的数据,标题,时间,地址,访问量 title = scrapy.Field() time = scrapy.Field() address = scrapy.Field() visites = scrapy.Field()
Spiders/Walks_Spider.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 #encoding=utf-8 #导入爬虫类 import scrapy #导入我们刚才建立的存储数据的类 from MyblogContent.items import MyblogcontentItem class WalksSpider(scrapy.Spider): #唯一标识符 name = "Walks" #允许的域名(只可以从这个域名中爬取) allowed_domains = ['bywalks.com'] #开始爬取的地址 start_urls = [ "http://www.bywalks.com" ] #对爬取的数据(HTML)进行提取 def parse(self,response): #调用Selector,sel就是返回的HTML sel = scrapy.selector.Selector(response) #定位爬取数据 sites = sel.xpath("//div[@id='kratos-blog-post']/div/div/section/article") items = [] for site in sites: item = MyblogcontentItem() #从HTML中提取数据 item["title"] =site.xpath("div/div[@class='kratos-post-inner-new']/header/h2/a/text()").extract() item["time"] = site.xpath("div/div[@class='kratos-post-meta-new']/span[1]/a[1]/text()").extract() item["address"] =site.xpath("div/div[@class='kratos-post-meta-new']/span[1]/a[1]/@href").extract() item["visites"] = site.xpath("div/div[@class='kratos-post-meta-new']/span[2]/a[1]/text()").extract() items.append(item) return items
pipelines.py 1 2 3 4 5 6 7 8 9 10 11 12 class MyblogcontentPipeline(object): #对提取出来的数据进行存储 def process_item(self, item, spider): #打开Walks.json文件,不存在就新建 with open('Walks.json','a+') as f: #写入我们爬取的数据 f.write("title = "+str(item["title"])+'\n') f.write("time = "+str(item["time"])+'\n') f.write("address = "+str(item["address"])+'\n') f.write("visites = "+str(item["visites"])+'\n\n') #返回item,给下一个处理函数处理(如果有的话) return item
sittings.py 1 2 3 4 5 6 7 8 9 10 11 12 13 OT_NAME = 'MyblogContent' SPIDER_MODULES = ['MyblogContent.spiders'] NEWSPIDER_MODULE = 'MyblogContent.spiders' #上面都是直接生成了的,不用添加 #下面使我们自己需要添加的代码,意思就是当我们提取了所需要的数据之后,把数据传入Pipeline里面进行处理,也就是我们上面的py文件 #为什么要添加呢?因为pipeline不是一个爬虫所必须的功能,我们可以自己加也可以不加,所以当需要的时候,我们需要设置下 ITEM_PIPELINES = { 'MyblogContent.pipelines.MyblogcontentPipeline':300 } #是否遵循网站robots.txt的规则 ROBOTSTXT_OBEY = False
最后附带一张爬取的数据图片
Author:
Bywalks
Permalink:
http://bywalks.com/2017/10/22/python3-study-06/
License:
Copyright (c) 2022 CC-BY-NC-4.0 LICENSE
Slogan:
Do you believe in DESTINY ?