Scrapy(八):使用scrapy爬虫并将数据保存到MySQL数据库

1. 环境搭建:

1.python3.6版本
2.pycharm编辑器(别的编辑器也可以)。
3.mySQL数据库
4.navicat for mysql
5.scrapy爬虫框架
下载这块就不多说了,网上很多下载安装教程及解决方案。遇到问题不要着急,根据报错信息查找解决。

2. 操作步骤:

2.1 爬虫的实现

2.1.1 首先我们使用命令行新建一个scrapy项目。

windows使用win+R,输入cmd,进入终端。进入你想创建项目的文件目录,输入scrapy start project hellospider(项目名)。等待scrapy自动生成文件,此时使用编辑器打开hellospider文件夹,你会看这样的结构:


2.1.2 接下来,创建爬虫文件。

cd helloSpider
scrapy genspider myspider "baidu.com"

2.1.3 .修改items.py文件。

文件内容如下:

import scrapy
class DetailItem(scrapy.Item):
    # 抓取内容:1.帖子标题;2.帖子作者;3.帖子回复数
    title = scrapy.Field()
    author = scrapy.Field()
    reply = scrapy.Field()

2.1.4 修改myspider.py文件。

在spiders文件夹下创建了myspider.py文件。然后再在文件中添加内容如下:

import scrapy
from hellospider.items import DetailItem
#上一行不同版本的python可能会出现红色波浪线,不用管

class MySpider(scrapy.Spider):
    """
    name:scrapy唯一定位实例的属性,必须唯一
    allowed_domains:允许爬取的域名列表,不设置表示允许爬取所有
    start_urls:起始爬取列表
    """
    # 设置name
    name = "spidertieba"
    # 设定域名
    allowed_domains = ["baidu.com"]
    #设置爬取地址列表
    box = []
    for num in range(301):
        if num % 50 ==0:
            pages =  'http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=utf-8&&pn={0}'.format(num)
            box.append(pages)
        else:
            continue
    # 填写爬取地址
    start_urls = box
    #print(box) 用于测试
    # 编写爬取方法
    def parse(self, response):
        for line in response.xpath('//li[@class=" j_thread_list clearfix"]'):
            # 初始化item对象保存爬取的信息
            item = DetailItem()
            # 这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
          #  item['id'] = line.xpath(
          #      './/div[contains(@class,"threadlist_title pull_left j_th_tit ")]/a/@href').extract()[0][3:6]
            item['title'] = line.xpath(
                './/div[contains(@class,"threadlist_title pull_left j_th_tit ")]/a/text()').extract()[0]
            item['author'] = line.xpath(
                './/div[contains(@class,"threadlist_author pull_right")]//span[contains(@class,"frs-author-name-wrap")]/a/text()').extract()[0]
            item['reply'] = line.xpath(
                './/div[contains(@class,"col2_left j_threadlist_li_left")]/span/text()').extract()[0]
            yield item

2.1.5 运行爬虫

此时你可以通过命令行“scrapy crawl spidertieba”。注意运行的要与py文件中的name值相同,运行爬虫文件查看爬取过程打印的日志。这仅仅实现了爬虫,接下来我们继续说怎样将爬取的数据保存到mysql中。

2.2 将数据保存到MySQL

2.2.1 通过查看爬取的数据的形式,在数据库可视化工具或直接通过命令行创建数据库。

初学者可以使用navicat直接连接数据库,点击右键会出现新建数据库,新建表,并且可以定义表的结构。这个方法比较简单。
第二种方式是进入mysql终端,登陆后,创建数据库,创建表,定义表结构,表结构要和你爬取数据的结构相对应。

CREATE DATABASE tieba;
USE tieba;
CREATE TABLE articles (id BIGINT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY, reply VARCHAR(100), author VARCHAR(100), title VARCHAR(100));

可通过如下命令查看表结构。

DESCRIBE articles;

2.2.2 建立好数据表后,就可以编辑pipelines.py文件,实现将爬虫与数据库相连接。

文件内容如下:

import pymysql
#连接数据库
def dbHandle():
    conn = pymysql.connect(
        host = "localhost",
        user = "****",
        passwd = "******",
        charset = "utf8",
        use_unicode = False
    )
    return conn

class HellospiderPipeline(object):
    def process_item(self, item, spider):
        dbObject = dbHandle()
        cursor = dbObject.cursor()
        cursor.execute("USE tieba")
        #插入数据库
        sql = "INSERT INTO articles(title,author,reply) VALUES(%s,%s,%s)"
        try:
            cursor.execute(sql,
                           ( item['title'], item['author'], item['reply']))
            cursor.connection.commit()
        except BaseException as e:
            print("错误在这里>>>>>>>>>>>>>", e, "<<<<<<<<<<<<<错误在这里")
            dbObject.rollback()
        return item

2.2.3 设置settings.py文件,文件内容如下:

USER_AGENT: 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36'

ITEM_PIPELINES = {
       'hellospider.pipelines.HellospiderPipeline': 300,
}

ROBOTSTXT_OBEY = False

最后,就可以在命令行通过scrapy crawl spidertieba 来见证神奇的一刻啦,你会看到navicat数据表里多了你想要爬取的数据,如果数据表没有数据,可以尝试关闭重新连接一下数据库。
运行结果如下:
在这里插入图片描述
在这里插入图片描述

注意:多次运行爬虫,会将数据追加到数据库中。

 

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得。 这说明我们想要的元素是在我们的某些操作下通过js事件动态生成的。举个例子,我们在刷QQ空间或者微博评论的时候,一直往下刷,网页越来越长,内容越来越多,就是这个让人又爱又恨的动态加载。 爬取动态页面目前来说有两种方法 分析页面请求(这篇介绍这个) selenium模拟浏览器行为(霸王硬上弓,以后再说) 言归正传,下面介绍一下通过分析页面请求的方法爬取动态加载页面的思路。中心思想就是找到那个发请求的javascript文件所发的请求。 举两个例子,京东评论和上证股票。 后注:本文的两个例子都是get请求,可以显示的在浏览器中查看效果,如果是post请求,需要我们在程序中构造数据,构造方法可以参考我从前的一篇博文Scrapy定向爬虫教程(六)——分析表单并回帖。 京东评论 这是一个比较简单的例子。 首先我们随便找一个热卖的商品,评论比较多。 就这个吧威刚(ADATA) SU800 256G 3D NAND SATA3固态硬盘。 点进去看看这个页面现在的状况 图一 滚动条给的第一印象感觉这页仿佛没多少内容。 键盘F12打开开发者工具,选择Network选项卡,选择JS(3月12日补:除JS选项卡还有可能在XHR选项卡中,当然也可以通过其它抓包工具),如下图 图二 然后,我们来拖动右侧的滚动条,这时就会发现,开发者工具里出现了新的js请求(还挺多的),不过草草翻译一下,很容易就能看出来哪个是取评论的,如下图 图三 好,复制出js请求的目标ur

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值