Python 后端爬虫Scrapy 框架使用

整个专栏的文章,主要是围绕Python 后端Web开发 ,从第三方网页中爬取数据,并保存到后台MySQL 数据库中,然后提供Api接口供Android 客户端调取,并且对其中传输的数据采取AES 加密方式传输。

第一篇:主要讲解Python 后端爬虫Scrapy 框架的使用,用来爬取第三方网页并将数据存储到自己的数据库中。

熟悉的Python 同学,应该都熟悉PyCharm 这款IDE 吧,搭建Python 简单环境之类的就不在这里说了。

这里是该项目下载资源链接的地址:
https://download.csdn.net/download/m0_37094131/10827189

一 :Python 安装Scrapy 模块 : 有以下几种方法

  1. 在PyCharm 的Terminal 终端环境下: 输入命令: pip install scrapy
    若还不熟悉pip 命令操作的可以自行百度,其实就是Python 的一个安装模块包工具,可以很方便的快速安装python 的一些流行的框架,类似于Node.js 中 npm

  2. 去PyCharm 的 Settings 中Project Interpreter ,然后点击右边的"+",然后去搜索scrapy 即可

  3. 去https://pypi.org/ 这个网站,去搜索下载模块,然后倒入到你的python 虚拟环境中,也可以

二:安装好Scrapy 模块后,就可以开始去写代码
1.首先去找一个好爬的网站(好爬指的是那些不需要一些登录验证的操作,因为这可能直接导致你在爬取过程中直接失败, 不过好像可以通过cookie 绕过去,有兴趣的读者可以自行研究)
我这里找的网站是"本地宝": http://ly.sz.bendibao.com/tour/8972.html
在这里插入图片描述

在这里插入图片描述

红色的标记主要是:爬取的Item 上面的一些字段,主要是标题,时间,地点,票价,图片的Logo的Url,以及跳转页的Url等

橙色的标记主要是:为了不断循环去爬取所有的页面的链接地址

2.确定要爬取的主页,以及爬取的具体Item的内容后,就可以开始敲代码了
首先:在终端Terminal 敲下命令: scrapy startproject bendibao ,输入之后,刷新一下,可以看到下面这样的目录结构!在这里插入图片描述

3.现在开始写Python 代码:
首先在items.py中编写一个item 类:确定一些字段

import scrapy
class BendibaoItem(scrapy.Item):
    cname = scrapy.Field()
    ctime = scrapy.Field()
    address = scrapy.Field()
    price = scrapy.Field()
    photo = scrapy.Field()
    urlLink = scrapy.Field()
    pass

然后确定后台数据库的连接方式,有MySQL 数据库也有自带的SQLite 数据库,也可以选择基于键值对的MongoDB 数据库

1,可以采用MySQL 方式:
新建一个MySQLPipeline.py 文件在里面写:

import pymysql.cursors

class MySQLPipeline(object):

    def __init__(self):
        #连接数据库
        self.connect = pymysql.connect(
            host = '127.0.0.1',
            port = 3306,
            db = 'bendibao',
            user = 'root',
            passwd = 'root',
            charset = 'utf8',
            use_unicode = True
        )
        self.cursor = self.connect.cursor()

    def process_item(self,item,spider):
        self.cursor.execute(
            # 纯属python操作mysql知识,不熟悉请恶补
            """insert into app_activity(cname, ctime, address,price ,photo , urlLink)
                       value (%s, %s, %s, %s, %s , %s)""",
            (item['cname'], item['ctime'],item['address'],item['price'],item['photo'],item['urlLink'],)
        )
        #提交sql语句
        self.connect.commit()
        #必须实现返回
        return item

这样就新建了一个叫bendibao 的数据库,以及名为app_activity 的表

2.也可以用MongoDB 的方式建立后台数据库


import pymongo
class InputmongodbPipeline(object):

    def __init__(self):
        #连接mongo db 数据库
        client = pymongo.MongoClient('127.0.0.1', 27017)
        #新建一个数据库
        db = client['ScrapyChina']
        #新建一个表
        self.post = db['mingyan']

    def process_item(self, item, spider):
        #将对象转换成一个字典
        postItem = dict(item)
        #然后将该字典json 数据插入表中
        self.post.insert(postItem)
        return item

可以在PyCharm 上安装一个Mongo 可视化插件 比如Mongo Plugin ,安装好之后,若存入Mongo 数据库成功后,就可以看到如下的结构,
在这里插入图片描述

确认好model 以及后台数据库之后,就可以开始写最重要的爬虫代码了:
1.在spiders 文件夹中新建一个BenDiBaoSpider.py 文件,而它原有自带的__init__.py 文件不需要去管它,因为它只是一个表示这是个文件夹而已,新建好之后,就开始写

# -*- coding: utf-8 -*-
import scrapy
from ..items import BendibaoItem
class BenDiBaoSpider(scrapy.Spider):

    name = "BenDiBaoSpider"
    allowed_domains = ["ly.sz.bendibao.com"]
    start_urls = ['http://ly.sz.bendibao.com/tour/8972_2.html']


    def parse(self, response):
        play = response.css("div.section")
        item = BendibaoItem()
        for v in play:
            item['cname'] = v.css('dt a::text').extract_first()
            item['ctime'] = v.css('.icon_zise::text').extract()[0]
            item['address'] = v.css('.icon_zise::text').extract()[1]
            item['price'] = v.css('.icon_zise::text').extract()[2]
            item['photo'] = v.css('a img::attr(src)').extract_first()
            item['urlLink'] = v.css('dt a::attr(href)').extract_first()


            # item['photo'] = v.css('a img::attr(src)').extract_first()
            # item['urlLink'] = v.css('a:attr(href)').extract_first()
            yield item  # 把取到的数据提交给pipline处理

        start_url = 'http://ly.sz.bendibao.com'
        next_page = response.css('#ctl00_NextPage::attr(href)').extract_first()  # css选择器提取下一页链接
        print("next_page", next_page)
        if next_page is not None:  # 判断是否存在下一页
            next_page = response.urljoin(next_page)
            print("next_page 22", next_page)
            yield scrapy.Request(next_page, callback=self.parse)  # 提交给parse继续抓取下一页

主要分3块:

  1. name 为Scrapy 框架等下开始爬的爬虫名, 还有域名,以及要爬的网址等
  2. css 选择器,熟悉前端的知道可以按F12 查看该网页的源代码,然后利用检查元素,可以定位到每个标签的位置,进而可以查看它的id,class,value等等,就可以写一些js 脚本进而修改整个html页面等,爬虫只需要筛选指定元素,并将其中的值保存到后台数据库即可
  3. 爬虫的自动爬取,确认好爬虫的下一页需要爬取的网址后,就可以让它自动爬取下一页,然后每一页又按照之前的css 筛选,进而可以爬完整个你想要爬完的内容

写完这些爬虫代码后,最后还要注意一下settings.py 文件中的ITEM_PIPELINES 字段,需要配置与你数据库关联的那个类名:比如:

ITEM_PIPELINES = {
    'bendibao.MySQLPipeline.MySQLPipeline' : 300,
}

完成这些步骤后,就可以启动整个爬虫了,只需输入一条命令:

scrapy crawl  BenDiBaoSpider

这里的crawl 后面跟着的正好是之前写好的spider 的 name.

最后,安装一个Navicat 可视化数据库软件,以及phpStudy 软件(一个可以快速启动Apache 服务,MySQL 服务的软件 ,就不需要你自己手动输命令去启动了哈),可以看下成果!
在这里插入图片描述

在这里插入图片描述

大概有1000条记录,最后,我会把整个项目放到我的资源下载中,大家有兴趣的童鞋可以去下载看下,不过我觉得还是优先自己敲会比较好,学的也会比较多哦!!!

发布了22 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_37094131/article/details/84060944