Python爬取博客社区文章并写入数据库

简介

使用scrapy爬虫框架,爬取博客首页导航栏中分类的社区文章信息
**爬取内容:**文章标题、作者和简介。

技术概述

  • 使用scrapy框架运行程序
  • 使用xpath解析网页源码
  • mysql、pymysql

思路

1. 创建scrapy项目。
确定起始访问页start_urls
2. 获取标签链接。
从start_urls对应网页源码中解析出所有分类标签的链接地址,并对每个标签的地址逐一进行访问。
3. 解析源码。
在实际csdn网页中,使用xpath插件写出正确的xpath路径,选中文章的信息。(我是先获取包含文章的div列表,再进一步获取文章信息,可以使代码简洁一丢)
4. 封装。
封装成item对象,返回给管道
5. 数据写入。
管道中负责将对象写入mysql数据库

代码预览

#							爬虫文件
import scrapy
import operator
from scrapy_CSDN.items import ScrapyCsdnItem
# 若需要爬取动态加载部分的数据,对应的接口:
# https://cms-api.csdn.net/v1/web_home/select_content?componentIds=www-blog-recommend&cate1=back-end

class CsdnSpider(scrapy.Spider):
    name = 'CSDN'
    allowed_domains = ['blog.csdn.net']
    start_urls = ['http://blog.csdn.net/nav/java']

    def parse(self, response):

        # 获取包裹各分类标签的li元素
        li_list = response.xpath('//div[@class="blog-nav-box"]//li/a')

        for li in li_list:
            # 获取各分类标签的链接
            url = li.xpath('./@href').extract_first()
            # 因为部分链接不是完整的url地址,将不含http协议头的url补全
            if not operator.contains(url,'http'):
                url = 'http://blog.csdn.net' + url
            # 发送请求  (给引擎)
            yield scrapy.Request(url=url,callback=self.parse_)


    def parse_(self,response):
        # 获取div列表 每个div包含一个文章的信息
        article_list = response.xpath('//div[@class="Community"]/div')
        for article in article_list:
            # 获取文章的各部分信息
            title = article.xpath('.//a/span[@class="blog-text"]/text()').extract_first()
            intr = article.xpath('.//div[@class="content"]//p[@class="desc"]/text()').extract_first()
            author = article.xpath('.//div[@class="content"]//div[@class="operation-c"]/a/span/text()').extract_first()
            # 选中的div中,有些是空的,跳过
            if not title:
                continue
            # 将文章信息封装为item,返回给管道,管道写入数据库
            yield ScrapyCsdnItem(title=title,intr=intr,author=author)
        print('++++++'+response.url+' done...')

# 						管道文件pipelines.py
import pymysql
from scrapy.utils.project import get_project_settings

class ScrapyCsdnPipeline:
    def open_spider(self, spider):
        # 获取配置文件对象
        settings = get_project_settings()
        # 获取配置文件中的数据库连接信息
        self.host = settings['DB_HOST']
        self.port = settings['DB_PORT']
        self.user = settings['DB_USER']
        self.password = settings['DB_PASSWORD']
        self.name = settings['DB_NAME']
        self.charset = settings['DB_CHARSET']
        self.connect()

    def connect(self):
        # 获取连接
        self.conn = pymysql.connect(
            host=self.host,
            port=self.port,
            user=self.user,
            password=self.password,
            db=self.name,
            charset=self.charset
        )
        # 定义光标
        self.corsor = self.conn.cursor()

    def process_item(self, item, spider):
        # sql插入语句
        sql = 'insert into articles(title,author,intr) values("{}","{}","{}")'.format(item['title'],
                                                                                      item['author'],
                                                                                      item['intr'])
        # 执行sql
        self.corsor.execute(sql)
        # 提交
        self.conn.commit()
        return item

    def close_spider(self, spider):
        # 关闭所有连接
        self.conn.close()
        self.corsor.close()

数据展示

![在这里插入图片描述](https://img-blog.csdnimg.cn/5b706242014642a4bd8710dbb

可改进(完善)

  • 未使用链接提取器LinkExtractor:
    对于各标签链接的获取,可能是网页的反爬机制,无法通过LinkExtractor链接提取器快速获得所有链接。(有没有big old指导一下)
    在这里插入图片描述

补充

  • 关于懒加载部分(代码中未实现):
    CSDN网站的社区文章页面是使用懒加载模式的,在代码中并未实现。
    请求懒加载部分的文章数据的接口是

    https://cms-api.csdn.net/v1/web_home/select_content?componentIds=www-blog-recommend&cate1=back-end
    

    通过访问该接口,得到返回的json数据,解析后封装成对象,返回给通道即可。

    												有误请指正
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值