爬虫 - 博客爬取并入库


'''
对崔庆才的个人博客上的文章基本信息的爬取 (共41页)
https://cuiqingcai.com/page/1
标题、链接、浏览的数目、评论的数目以及喜欢的人数
'''
import re
import requests
import logging
from lxml import etree
import pymysql

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class DBconnect(object):
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', port=3306, user='', password='',db='spider')
        self.cursor = self.conn.cursor()

    def save(self, table, data):
        '''判断数据是列表还是字典'''
        print('数据类型',type(data))
        try:
            if isinstance(data,dict):
                sql = "insert ignore into " + table + str(tuple(data.keys())) + 'values' + str(tuple(data.values())) + ";"
                self.cursor.execute(sql, data)
            elif isinstance(data,list):
                for d in data:
                    sql = "insert ignore into " + table + ' values' + str(tuple(d.values())) + ";"
                    print(sql)
                    self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            logging.error(e)
            self.conn.rollback()

class BlogSpider():
    def __init__(self):
        self.base_url = 'https://cuiqingcai.com/page/'
        self.total_page = 41

    def parse_url(self,url):
        res = requests.get(url,verify=False)
        return res.text

    def parse_content(self,html):
        tree = etree.HTML(html)
        articles = tree.xpath("//div[@class='content']/article")
        data_list = []
        for article in articles:
            category = article.xpath("./header/a/text()")
            category = category[0] if category else None
            title =article.xpath("./header/h2/a/text()")[0] if article.xpath("./header/h2/a/text()") else None
            synopsis = article.xpath("./span/text()")[0]
            picture = article.xpath("./div/a/img/@src")[0]
            author = article.xpath('./p/span[1]/a/text()')[0]
            publish_time = article.xpath("./p/span[2]/text()")[0]
            page_view = article.xpath("./p/span[3]/text()")[0]
            page_view = int(re.findall('\d+',page_view)[0])
            comment = article.xpath("./p/span[4]/a/text()")[0]
            comment = int(re.findall('\d+',comment)[0])
            likes = article.xpath("./p/span[5]/a/span/text()")[0]
            # data_dic = {'category':category,'title':title,'synopsis':synopsis,'picture':picture,'author':author,'publish_time':publish_time,
            #             'page_view':page_view,'comments':comments,'likes':likes}
            data_dic = {'title': title,'author': author, 'publish_time': publish_time,
                        'page_view': page_view, 'comment': comment}
            data_list.append(data_dic)
        return data_list

    def save_data(self,data_list):
        db = DBconnect()
        # 先创建表
        table_name = 'blogs'
        sql = """
        create table if not exists blogs(
        title varchar(100) not null,
        author varchar(30) not null,
        publish_time varchar(30) not null,
        page_view int(6) not null,
        comment int(6) not null
        );
        """
        sql2 = "alter table blogs add unique key(publish_time);"
        db.cursor.execute(sql)
        db.cursor.execute(sql2)
        # db.cursor.execute(sql)
        # 保存数据到数据库
        db.save(table='blogs',data = data_list)

    def run(self):
        for i in range(1,41):
            url = self.base_url + str(i)
            # 请求
            str_html = self.parse_url(url)
            # 解析网页
            data_list = self.parse_content(str_html)
            print(data_list)
            # 存储数据
            self.save_data(data_list)
        return {'status_code':'200'}

if __name__ == '__main__':
    bs = BlogSpider()
    bs.run()

原文地址:https://www.cnblogs.com/Afrafre/p/11739115.html

时间: 2024-10-31 08:31:18

爬虫 - 博客爬取并入库的相关文章

cnblogs 博客爬取 + scrapy + 持久化

cnblogs_spider.py # -*- coding: utf-8 -*- import scrapy from ..items import TttItem class ChoutiSpider(scrapy.Spider): name = 'chouti' # 爬虫名字 start_urls = ['https://www.cnblogs.com'] def parse(self, response): div_list = response.xpath('//div[@class=

我是怎么处理其他网站恶意爬虫博客园的,希望大家喜欢(第二弹)

本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 现象 版权处理升级 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 介绍 上次写了一篇我是怎么处理其他网站恶意爬虫博客园的,希望大家喜欢,然后大家回复积极,对于我也是一个鼓励,针对上次还有个网站过滤掉了我的版权说明,在这一次却没

【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人的地方在于它是一个框架,任何人都可

爬虫的定向爬取与垂直搜索

转 爬虫的定向爬取与垂直搜索 定向爬虫是网络爬虫的一种. 定向爬虫 定向爬虫可以精准的获取目标站点信息. 定向爬虫获取信息,配上手工或者自动的模版进行信息匹配,将信息进行格式化分析存储. 优势: 基于模版的信息提取技术,能提供更加精准的信息.比如价格,房屋面积,时间,职位,公司名等等. 劣势: 目标网站难以大面积覆盖,因为基于模版匹配的信息提取技术,需要人工的参与配置模版,欲要大面积覆盖各个目标网站,需要大量的人力成本,同样维护模板也需要很大的人力成本. 也就是说定向爬取就是我们要针对不同的网页

教你分分钟学会用python爬虫框架Scrapy爬取你想要的内容

教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 python爬虫学习课程,下载地址:https://pan.baidu.com/s/1v6ik6YKhmqrqTCICmuceug 课程代码原件:课程视频: 原文地址:http://blog.51cto.com/aino007/2123341

爬虫入门之爬取策略 XPath与bs4实现(五)

爬虫入门之爬取策略 XPath与bs4实现(五) 在爬虫系统中,待抓取URL队列是很重要的一部分.待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面.而决定这些URL排列顺序的方法,叫做抓取策略.下面重点介绍几种常见的抓取策略: 1 深度优先遍历策略: 深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接.我们以下面的图为例:遍历的路径:A-F-G E-H-I B C D

Python 爬虫入门之爬取妹子图

Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob/master/%E7%88%AC%E8%99%AB%E9%9B%86%E5%90%88/meizitu.py 爬虫成果 当你运行代码后,文件夹就会越来越多,如果爬完的话会有2

python爬虫-基础入门-爬取整个网站《3》

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

爬虫练手,爬取新浪双色彩,信息并进行分析

爬虫练手,爬取新浪双色彩,信息并进行分析 import requests from lxml.html import etree url = 'http://zst.aicai.com/ssq/betOrder/' response = requests.get(url) response_html = etree.HTML(response.text) text_path = '/html/body/div[7]/form/div[2]/table/tbody/tr/td/text()' da