利用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"})
    


八、运行结果

 



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012017783/article/details/76512776

分布式爬虫以及Scrapy源码剖析

-
  • 1970年01月01日 08:00

scrapy爬虫并保存到数据库

  • 2018年01月29日 18:58
  • 10KB
  • 下载

使用scrapy爬取伯乐在线文章并保存到mysql

  • 2017年05月28日 17:27
  • 46KB
  • 下载

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

scrapy爬取的数据存入mysql,mongoDB
  • wqh_jingsong
  • wqh_jingsong
  • 2017-02-11 11:06:20
  • 2771

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

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

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

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

Python3 + Scrapy 爬取豆瓣评分数据存入Mysql与MongoDB数据库。

首先我们先抓包分析一下,可以看到我们想要的每一页的全部数据都在&quot;article&quot;下。而其中每一部的电影的数据可以看到在&quot;info&quot;下。所以我们只要在info下找...
  • Mr_blueD
  • Mr_blueD
  • 2018-02-19 20:34:36
  • 205

利用scrapy轻松爬取招聘网站信息并存入MySQL

Scrapy版本:1.4; Python版本:3.6; OS:win10; 本文完整项目代码:完整示例; 本文目标: 通过爬取腾讯招聘网站招聘岗位,熟悉scrapy,并掌握数据库存储操作;...
  • chengcheng95588
  • chengcheng95588
  • 2018-01-04 01:38:36
  • 491

Scrapy框架爬取51job和智联招聘数据信息

  • 2018年02月28日 14:42
  • 14KB
  • 下载

使用scrapy简单爬取图片并保存

第一次写博客 有什么需要改进的地方欢迎留言改进 本次代码运行是基于Linux系统 python3  scrapy框架运行 1.先看结果2.接着上代码spider# -*- coding: utf-...
  • xia_mo_luo
  • xia_mo_luo
  • 2017-12-27 00:00:53
  • 128
收藏助手
不良信息举报
您举报文章:利用Scrapy框架爬取博客信息并存到mysql数据库
举报原因:
原因补充:

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