python- (scrapy上)爬取csdn所有博客内容

创建csdn博客scrapy

python- (scrapy上)爬取csdn所有博客内容_第1张图片为了避免冲突,独立将生成的csdnSpider文件夹打开

python- (scrapy上)爬取csdn所有博客内容_第2张图片

1编写csdn.py

# -*- coding: utf-8 -*-
import scrapy
class CsdnSpider(scrapy.Spider):
    name = 'csdn'
    allowed_domains = ['csdn.net']
    start_urls = ['https://blog.csdn.net/weixin_40543283',
                  # https: // blog.csdn.net / weixin_40543283
                ]

    def parse(self, response):
        pass

2.item.py


import scrapy


class csdnItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    url = scrapy.Field()
    content = scrapy.Field()

3.解析页面csdn.py—>parse

审查元素–>查找规律—>解析页面
python- (scrapy上)爬取csdn所有博客内容_第3张图片python- (scrapy上)爬取csdn所有博客内容_第4张图片发现每篇博客都存放在

这个标签里
点开分析:
python- (scrapy上)爬取csdn所有博客内容_第5张图片
我们需要标题(a标签里)和url地址(href)

    def parse(self, response):
        boxs = response.xpath('//div[@class="article-item-box csdn-tracking-statistics"]')
        for box in boxs:
            item = CsdnspiderItem()
            # 类似于字典的对象
            # ************将item对象实例化在for循环里面, 否则每次会覆盖之前item的信息;*******

            item['title'] = box.xpath('./h4/a/text()')[1].extract().strip()
            # 当前div标签里的h4标签下的a标签里的文本信息,有两个文本信息取索引为1的,
            # 不加extract()将生成一个对象,因为标题中打印左右两侧右空格 所以用strip去掉
            # html代码
            #         

# # # 原 # nginx设置文件介绍 #

item['url'] = box.xpath('./h4/a/@href')[0].extract() # 这个url进去就是博客内容 # print("1. *****************", item['title']) yield scrapy.Request(item['url'], meta={'item': item}, callback=self.parse_article) # 返回一个请求给parse_article,将item中获得的url地址返回,meta 传递的内容

这里url保存的就是博客内容,所以我们需要再对url这个新页面进行解析:这里我们不需要标题信息,直接需要博客内容所以我们找到博客内容的标签:

python- (scrapy上)爬取csdn所有博客内容_第6张图片

    # 解析content
    def parse_article(self,response):
        item = response.request.meta['item']
        content = response.xpath('//div["article_content"]').extract()[0]
        item['content'] = content
        yield item

因为我们需要爬取的是博客里所有内容,所以还应该实现一个翻页功能。我翻页到第二页发现有规律:只要改变页码2就可以翻页。
在这里插入图片描述

所以在settings里面添加一个页码csdnpage,我这个爬取的博客有9页。

python- (scrapy上)爬取csdn所有博客内容_第7张图片在csdn.py文件中导入

from csdnSpider.settings import CsdnPage
        # 实现翻页的功能
        for page in range(2, CsdnPage+1):
            url = "https://blog.csdn.net/weixin_40543283/article/list/%s" %(page)
            yield  scrapy.Request(url, callback=self.parse)
    # 解析content

完整的csdn.py文件:

import scrapy
from csdnSpider.items import CsdnspiderItem
from csdnSpider.settings import CsdnPage
class CsdnSpider(scrapy.Spider):
    name = 'csdn'
    allowed_domains = ['csdn.net']
    start_urls = ['https://blog.csdn.net/weixin_40543283',
                  # 如果想爬去多个网址可以在下面添加
                  # 'https://blog.csdn.net/gf_lvah',
                ]

    def parse(self, response):
        boxs = response.xpath('//div[@class="article-item-box csdn-tracking-statistics"]')
        for box in boxs:
            item = CsdnspiderItem()
            # 类似于字典的对象
            # ************将item对象实例化在for循环里面, 否则每次会覆盖之前item的信息;*******

            item['title'] = box.xpath('./h4/a/text()')[1].extract().strip()
            # 当前div标签里的h4标签下的a标签里的文本信息,有两个文本信息取索引为1的,
            # 不加extract()将生成一个对象,因为标题中打印左右两侧右空格 所以用strip去掉
            #         

# # # 原 # nginx设置文件介绍 #

item['url'] = box.xpath('./h4/a/@href')[0].extract() # 这个url进去就是博客内容 # print("1. *****************", item['title']) yield scrapy.Request(item['url'], meta={'item': item}, callback=self.parse_article) # 返回一个请求给parse_article,将item中获得的url地址返回,meta 传递的内容 # 实现翻页的功能 for page in range(2, CsdnPage+1): url = "https://blog.csdn.net/weixin_40543283/article/list/%s" %(page) yield scrapy.Request(url, callback=self.parse) # 解析content def parse_article(self,response): item = response.request.meta['item'] content = response.xpath('//div["article_content"]').extract()[0] item['content'] = content yield item

4.保存为csv文件,pipeline.py

class CsvspiderPipeline(object):
    def __init__(self):
        self.f = open('csdn.csv','w')

    def process_item(self, item, spider):
        item=dict(item)
        self.f.write("{0}:{1}:{2}\n".format(item['title'],item['url'],item['content']))

        return item

    def open_spider(self,spider):
        pass
    def close_spider(self,spider):
        self.f.close()

在settings.py设置文件中设置
python- (scrapy上)爬取csdn所有博客内容_第8张图片
这里为了观察结果我只打印了item[‘title’]、item[‘url’]
python- (scrapy上)爬取csdn所有博客内容_第9张图片

你可能感兴趣的:(python,爬虫)