Loading

【第3篇】python爬虫实战-CSDN个人主页文章列表获取

本文教程利用 Scrapy 框架实现一个网络爬虫,本文代码实现CSDN个人主页文章列表爬取,已实现自动翻页,爬取的数据集最终保存为json文件,代码仅供参考学习交流。开始本教程前,请确保你的本机环境中已经正确安装了python环境以及scrapy框架,如若没有安装,请先自行百度相关安装教程后,再来阅读本文。

目录

1、创建Scrapy项目

2、创建一个爬虫

3、文件目录

4、代码实现

4.1、items.py

4.2、settings.py

4.3、csdn.py

4.4、pipelines.py

5、启动爬虫

6、爬取结果


1、创建Scrapy项目

scrapy startproject csdnSpider

2、创建一个爬虫

# 进入目录    
cd csdnSpider

#创建爬虫
scrapy genspider csdn csdn.net

3、文件目录

csdnSpider
    │  scrapy.cfg # 内容为scrapy的基础配置
    │
    └─csdnSpider
        │  items.py  # 定义爬虫程序的数据模型
        │  middlewares.py # 定义数据模型中的中间件
        │  pipelines.py # 管道文件,负责对爬虫返回数据的处理
        │  settings.py # 爬虫程序设置,主要是一些优先级设置,优先级越高,值越小
        │  __init__.py
        │
        ├─spiders
        │  │  csdn.py # 自定义爬虫引擎
        │  │  __init__.py
        │  │
        │  └─__pycache__
        │          __init__.cpython-37.pyc
        │
        └─__pycache__
                settings.cpython-37.pyc
                __init__.cpython-37.pyc

4、代码实现

小提示: scrapy目录中未改动过的代码,就没有贴出来了。

4.1、items.py

import scrapy

class CsdnspiderItem(scrapy.Item):
    # ID
    id = scrapy.Field()
    # 类型
    type = scrapy.Field()
    # 标题
    title = scrapy.Field()
    # 创建时间
    createTime = scrapy.Field()
    # 阅读量
    views = scrapy.Field()
    # 文章地址
    url = scrapy.Field()
    pass

4.2、settings.py

BOT_NAME = 'csdnSpider'

SPIDER_MODULES = ['csdnSpider.spiders']

NEWSPIDER_MODULE = 'csdnSpider.spiders'
# UA认证
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'

# robots协议
ROBOTSTXT_OBEY = False

# 优先级设置,值越小越先执行
ITEM_PIPELINES = {
    'csdnSpider.pipelines.CsdnspiderPipeline': 300,
}

4.3、csdn.py

import scrapy
from csdnSpider.items import CsdnspiderItem
from scrapy import Request
import re
from urllib.parse import urlparse


class CsdnSpider(scrapy.Spider):
    # 爬虫名称
    name = 'csdn'
    # 爬取域名范围
    allowed_domains = ['csdn.net']
    # 博客主页地址
    url = 'https://blog.csdn.net/qq_19309473'
    # 从这个页面开始
    start_urls = [url]

    # 初始化函数
    def __init__(self):
        # 开始页数
        self.page = 1
        # 记录条数
        self.count = 0

    # 解析器
    def parse(self, response):
        # 构建对象列表
        item = CsdnspiderItem()
        post_list = response.xpath('//*[@id="articleMeList-blog"]/div[2]/div')
        # 获取文章总条数
        blog_str = response.xpath('//*[@id="container-header-blog"]/span/text()').get()
        total_str = re.findall("博客\((.+?)\)", blog_str)[0]
        total = int(total_str)
        for post in post_list:
            # 记录条数加1
            self.count += 1
            item['id'] = self.count
            item['type'] = post.xpath('./h4//span/text()').get()
            item['title'] = post.xpath('./h4/a/text()')[1].extract().strip()
            item['createTime'] = post.xpath('.//span[@class="date"]/text()').get()
            item['views'] = post.xpath('.//span[@class="read-num"]/text()').get()
            item['url'] = post.xpath('./h4/a/@href').get()
            yield item
        # 循环换页爬取
        self.page += 1
        # 请求URL
        request_url = response.request.url
        # 协议
        protocol = urlparse(request_url).scheme
        # 域名
        domain = urlparse(request_url).netloc
        # author
        home = urlparse(request_url).path.split('/')[1]
        # 下一页地址
        next_url = "{}://{}/{}/article/list/{}".format(protocol, domain, home, self.page)
        # 最大页数
        maxPage = total // 40 if total % 40 == 0 else (total // 40 + 1)
        if self.page < maxPage + 1:
            yield Request(url=next_url, callback=self.parse, dont_filter=False)

4.4、pipelines.py

from scrapy.exporters import JsonLinesItemExporter

class CsdnspiderPipeline:

    # 初始化
    def __init__(self):
        # 新建并打开一个blog.json文件
        self.fp = open('blog.json', 'wb')
        self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
    
    #文本处理
    def process_item(self, item, spider):
        # 写入数据
        self.exporter.export_item(item)
        return item

    # 关闭
    def close_spider(self):
        # 关闭文件流
        self.fp.close()

5、启动爬虫

scrapy crawl csdn

6、爬取结果

posted @ 2020-12-22 01:50  Roc-xb  阅读(24)  评论(0)    收藏  举报

易微帮源码


易微帮官网