利用Scrapy框架爬取博客信息并存到mysql数据库

原创 2017年08月01日 11:36:21

一、所需要的库

          (1)Scrapy

          (2)pymysql

二、 创建数据库和表   

Create database hexun;
     Use hexun;
Create table myhexun(id int(10) auto_increment primary key not null,name varchar(30),url varchar(100),hits int(15),comment int(15));

三、 创建Scrapy项目


(1)创建Scrapy项目:    scrapy startproject hexunpjt 
(2)创建spider爬虫:    scrapy  genspider -t basic Myhexunspd hexun.com
(3)开始爬取:          scrapy crawl myhexunspd
               或者   scrapy crawl myhexunspd --nolog

四、 items编写

import scrapy


class HexunpjtItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
#建立name存储文章名
    name= scrapy.Field()
#建立url存储文章url网址
    url= scrapy.Field()
#建立hits存储文章阅读数
    hits= scrapy.Field()
#建立comment存储文章评论数
    comment= scrapy.Field()


 五、pipeline编写

# -*- coding: utf-8 -*-
import pymysql
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


class HexunpjtPipeline(object):

    def __init__(self):
        #刚开始时连接对应数据库
        self.conn=pymysql.connect(host="127.0.0.1", user="root", passwd="root", db="hexun")

    def process_item(self, item, spider):
        #每一个博文列表页中包含多篇博文的信息,我们可以通过for循环一次处理各博文的信息
        for j in range(0, len(item["name"])):
            # 将获取到的name、url、hits、comment分别赋给各变量
            name=item["name"][j]
            url=item["url"][j]
            hits=item["hits"][j]
            comment=item["comment"][j]
            #构造对应的sql语句,实现将获取到的对应数据插入数据库中
            sql="insert into myhexun(name,url,hits,comment) VALUES('"+name+"','"+url+"','"+hits+"','"+comment+"')"
            #通过query实现执行对应的sql语句
            self.conn.query(sql)
        return item


    def close_spider(self,spider):
        # 最后关闭数据库连接
        self.conn.close()


六、setting配置 

ITEM_PIPELINES = {
    'hexunpjt.pipelines.HexunpjtPipeline': 300,
}


# Disable cookies (enabled by default)
COOKIES_ENABLED = False


# Disable cookies (enabled by default)
COOKIES_ENABLED = False


# Obey robots.txt rules
ROBOTSTXT_OBEY = False

七、spider编写

# -*- coding: utf-8 -*-
import scrapy
import re
import urllib.request
from hexunpjt.items import HexunpjtItem
from scrapy.http import Request

class MyhexunspdSpider(scrapy.Spider):
    name = "myhexunspd"
    allowed_domains = ["hexun.com"]
    #设置要爬取的用户的uid,为后续构造爬取网址做准备
    uid = "19940007"
    #通过start_requests方法编写首次的爬取行为
    def start_requests(self):
        #首次爬取模拟成浏览器进行
        yield Request("http://"+str(self.uid)+".blog.hexun.com/p1/default.html",headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0"})


    def parse(self, response):
        item = HexunpjtItem()
        item['name']=response.xpath("//span[@class='ArticleTitleText']/a/text()").extract()
        item["url"]=response.xpath("//span[@class='ArticleTitleText']/a/@href").extract()
        #接下来需要使用urllib和re模块获取博文的评论数和阅读数
        #首先提取存储评论数和点击数网址的正则表达式
        pat1='<script type="text/javascript" src="(http://click.tool.hexun.com/.*?)">'
        #hcurl为存储评论数和点击数的网址
        hcurl=re.compile(pat1).findall(str(response.body))[0]
        # 模拟成浏览器
        headers2 = ("User-Agent",
                   "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0")
        opener = urllib.request.build_opener()
        opener.addheaders = [headers2]
        # 将opener安装为全局
        urllib.request.install_opener(opener)
        #data为对应博客列表页的所有博文的点击数与评论数数据
        data=urllib.request.urlopen(hcurl).read()
        #pat2为提取文章阅读数的正则表达式
        pat2="click\d*?','(\d*?)'"
        #pat3为提取文章评论数的正则表达式
        pat3="comment\d*?','(\d*?)'"
        #提取阅读数和评论数数据并分别赋值给item下的hits和comment
        item["hits"]=re.compile(pat2).findall(str(data))
        item["comment"]=re.compile(pat3).findall(str(data))
        yield item
        #提取博文列表页的总页数
        pat4="blog.hexun.com/p(.*?)/"
        #通过正则表达式获取到的数据为一个列表,倒数第二个元素为总页数
        data2=re.compile(pat4).findall(str(response.body))
        if(len(data2)>=2):
            totalurl=data2[-2]
        else:
            totalurl=1
        #在实际运行中,下一行print的代码可以注释掉,在调试过程中,可以开启下一行print的代码
        #print("一共"+str(totalurl)+"页")
        #进入for循环,依次爬取各博文列表页的博文数据
        for i in range(2,int(totalurl)+1):
            #构造下一次要爬取的url,爬取一下页博文列表页中的数据
            nexturl="http://"+str(self.uid)+".blog.hexun.com/p"+str(i)+"/default.html"
            #进行下一次爬取,下一次爬取仍然模拟成浏览器进行
            yield Request(nexturl,callback=self.parse,headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0"})
    


八、运行结果

 



版权声明:本文为博主原创文章,未经博主允许不得转载。

scrapy爬虫数据存入mysql数据库

上篇博客使用scrapy框架爬取豆瓣电影top250信息将各种信息通过json存在文件中,不过对数据的进一步使用显然放在数据库中更加方便,这里将数据存入mysql数据库以便以后利用。 运行环境: 1...
  • ljm_9615
  • ljm_9615
  • 2017年08月05日 13:20
  • 1418

笔记:scrapy爬取的数据存入MySQL,MongoDB

scrapy爬取的数据存入mysql,mongoDB
  • wqh_jingsong
  • wqh_jingsong
  • 2017年02月11日 11:06
  • 1681

scrapy爬取豆瓣电影top250并存储到mysql

1.定义item,只是作为测试用例,就只记录电影名称和评分吧 import scrapy class MovieTop250Item(scrapy.Item): # define the f...
  • a1091885194
  • a1091885194
  • 2017年12月02日 22:42
  • 96

Python3.6实现scrapy框架爬取数据并将数据插入MySQL与存入文档中

Python进阶(博主前面写过一篇基础的scrapy,刚学的同学可以去看看) 用scrapy框架爬取游戏信息,并将这些游戏信息插入MySQL中。 话不多说直接撸代码 1、同样是先建立工程 scrapy...
  • qq_31518899
  • qq_31518899
  • 2017年08月02日 14:03
  • 1107

scrapy 爬取网站并存入数据库实例

实例,官方有个实例教程,算是比较简单了,然后后面有更详细的一项项解释,不过老实讲我还真是看不太懂,很多地方没有给出实例,所以我在网上找了一大堆资料后,弄了一个实例。现在列出来跟大家分享。 1.实...
  • leaderway
  • leaderway
  • 2016年08月22日 00:56
  • 1336

Scrapy递归抓取数据存入数据库(示例二)

参考:http://www.hulufei.com/post/Some-Experiences-Of-Using-Scrapy           http://www.shahuwang.com/...
  • m0_37057274
  • m0_37057274
  • 2017年04月01日 11:03
  • 442

Scrapy抓取数据存入数据库(示例一)

一、示例一:Scrapy抓取豆瓣编程分类第一页的图书名称和链接并存入数据库 参考文章:http://tech.sina.com.cn/s/s/2008-12-24/09322685698.s...
  • m0_37057274
  • m0_37057274
  • 2017年03月31日 20:23
  • 714

python3 脚本爬取今日百度热点新闻并存放到mysql数据库

目标python3.x 脚本爬取今日百度热点新闻并存放到mysql数据库环境准备 安装pymysql pip install pymysql 下载安装mysql 5.x 知识点 python3.x ...
  • justheretobe
  • justheretobe
  • 2016年07月25日 23:27
  • 1523

scrapy 详细实例-爬取百度贴吧数据并保存到文件和和数据库中

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。使用框架进行数据的爬取那,可以省去好多力气,如不需要自己去下载页面...
  • sqc157400661
  • sqc157400661
  • 2017年07月18日 11:33
  • 2428

使用scrapy框架爬取豆瓣电影top250信息

看了几篇博客,跟着其他大佬的讲解学习了一下使用scrapy框架爬取网站信息,然后自己趁热打铁一波爬取一下豆瓣电影top250运行环境 1. win7-64bit 2. python 3.5.3 可以...
  • ljm_9615
  • ljm_9615
  • 2017年08月04日 20:19
  • 329
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Scrapy框架爬取博客信息并存到mysql数据库
举报原因:
原因补充:

(最多只允许输入30个字)