Python使用scrapy框架进行爬虫

    • 前言
    • 一.scrapy框架的简介
    • 二.框架图
    • 三.Python中相关包的介绍与安装
      • 1.scrapy
      • 2.urilib
      • 3.Beautiful soup
      • 4.pymongo
    • 四.项目文件的生成
    • 五.文件配置
      • 1.items
      • 2.middlewares
        • 添加header
      • 3.pipelines
        • (1)添加必备包和加载设置
        • (2)创建MONGODB数据库链接
        • (3)指定数据库
        • (4)存放数据的数据库名
        • (5)数据写入
      • 4.settings
        • (1)将ROBOTSTXT_OBEY = True改为
        • (2)将DOWNLOADER_MIDDLEWARES注释解开并加入中间件
        • (3)将ITEM_PIPELINES 注释解开用来执行pipelines函数
        • (4)添加USER_AGENT_LIST
        • (5)添加MONGODB数仓设置
    • 六.案列分析
      • 1.创建项目
      • 2.确认要提取的数据,定义item项
      • 3.写爬虫程序
        • (1)导入相关包
        • (2)确定目标网站并定义item字段
        • (3)使用xpath提取数据内容
        • (4)使用遍历循环进行解析
        • (5)爬取文章正文并写入数据
      • 4.进行爬取
      • 5.数据库数据展示
      • 6.补充:自动翻页
        • (1)有翻页按钮
        • (2)无翻页按钮
    • 七.Gerapy分部部署的搭建
      • 1.相关包的安装
      • 2.启动项目
        • (1)初始化
        • (2)数据迁移
        • (3)创建超级用户
        • (4)启动服务
        • (5)打开Gerapy
      • 3.启动scrapyd服务
      • 4.创建主机
      • 5.创建项目
      • 6.打包部署![在这里插入图片描述](https://img-blog.csdnimg/b1af70a62375444aa9c70f3d580939b5.png)
      • 7.创建任务![在这里插入图片描述](https://img-blog.csdnimg/efb6cb71ee484001828cc8959595595c.png)
      • 8.任务执行

前言

使用Python语言爬虫,可使用的框架由有很多种如Scrapy、PySpider、Crawley、Portia、Newspaper等等。根据课程学习内容本文主要介绍的是使用Scrapy框架进行爬虫的相关知识。

一.scrapy框架的简介

Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

二.框架图

三.Python中相关包的介绍与安装

1.scrapy

安装:打开cmd并输入pip install scrapy==2.6.1
这里我们选择安装的是2.6.1版本

2.urilib

urilib是Python自带的一个内置库,无需安装,直接使用即可。
它提供了如下功能:
网页请求
响应获取
代理和cookie设置
异常处理
URL解析

3.Beautiful soup

简称bs4是一个 Python 第三方库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。
安装:打开cmd并输入pip install bs4
由于bs4解析页面需要文档解析器,所以还需要安装lxml库pip install lxml

4.pymongo

pymongo是Python中用来操作MongoDB的一个库。
在爬虫结束后我们需要将数据保存到MongoDB数据库中,所以pymongo也是不可或缺的。
安装:pip install pymongo

四.项目文件的生成

新建一个文件夹,打开命令行
创建项目
scrapy startproject 项目名
在目录下创建news爬虫
scrapy genspider 爬虫名 域名
进行爬虫

scrapy crawl 爬虫名

五.文件配置

1.items

使用简单的类定义语法和Field 对象来声明要抓取的内容
本次案列我们所定义的内容如下:

 title = scrapy.Field()  #文章标题
    url = scrapy.Field()    #文章链接
    date = scrapy.Field()   #发布日期
    content = scrapy.Field() #文章正文
    site = scrapy.Field()   #网站名
    item = scrapy.Field()   #类别
    student_id = scrapy.Field()  #学生学号

2.middlewares

添加header

from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
from scrapy.utils.project import get_project_settings
import random

settings = get_project_settings()


class RotateUserAgentMiddleware(UserAgentMiddleware):
    def process_request(self, request, spider):
        referer = request.url
        if referer:
            request.headers["referer"] = referer
        USER_AGENT_LIST = settings.get('USER_AGENT_LIST')
        user_agent = random.choice(USER_AGENT_LIST)
        if user_agent:
            request.headers.setdefault('user-Agent', user_agent)
            print(f"user-Agent:{user_agent}")

3.pipelines

(1)添加必备包和加载设置

import pymongo  #加载pymongo

from scrapy.utils.project import get_project_settings

settings = get_project_settings()   #加载mongodb用户名,密码,端口号。ip地址

(2)创建MONGODB数据库链接

    def __init__(self):
        host = settings["MONGODB_HOST"]
        port = settings["MONGODB_PORT"]
        dbname = settings["MONGODB_DATABASE"]
        sheetname = settings["MONGODB_TABLE"]
        client = pymongo.MongoClient(host=host, port=port)   #无密码

(3)指定数据库

mydb = client[dbname]

(4)存放数据的数据库名

self.post = mydb[sheetname]

(5)数据写入

 def process_item(self, item, spider):
        data = dict(item)
        # 数据写入
        self.post.insert_one(data)
        return item

4.settings

(1)将ROBOTSTXT_OBEY = True改为

ROBOTSTXT_OBEY = False

(2)将DOWNLOADER_MIDDLEWARES注释解开并加入中间件

DOWNLOADER_MIDDLEWARES = {
    #'NewsData.middlewares.NewsdataDownloaderMiddleware': 543,
    'NewsData.middlewares.RotateUserAgentMiddleware': 543,
}

(3)将ITEM_PIPELINES 注释解开用来执行pipelines函数

ITEM_PIPELINES = {
    'NewsData.pipelines.NewsdataPipeline': 300,
}

(4)添加USER_AGENT_LIST

USER_AGENT_LIST = [
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
]

(5)添加MONGODB数仓设置

MONGODB_HOST = "localhost"  # 数仓IP
MONGODB_PORT = 27017  # 数仓端口号
MONGODB_DATABASE = "NewsData"  # 数仓数据库
MONGODB_TABLE = "News_Process_A"  # 数仓数据表单

六.案列分析

1.创建项目

scrapy startproject NewsData
genspider scrapy news " "

这里我们把域名设置为空

2.确认要提取的数据,定义item项

 title = scrapy.Field()  #文章标题
    url = scrapy.Field()    #文章链接
    date = scrapy.Field()   #发布日期
    content = scrapy.Field() #文章正文
    site = scrapy.Field()   #网站名
    item = scrapy.Field()   #类别
    student_id = scrapy.Field()  #学生学号姓名

3.写爬虫程序

(1)导入相关包

import scrapy
from NewsData.items import NewsdataItem
from bs4 import BeautifulSoup
from urllib import parse
import urllib

(2)确定目标网站并定义item字段

name = 'news'
    page_link = set()                                  #保存下一页页面url
    content_link = set()                               #保存页面内所有可获得的url
    allowed_domains = []
    start_urls = [
        ('https://www.chinanews/importnews.html', '中国新闻网', '要闻', '20201933'),
        ('https://www.chinanews/china.shtml', '中国新闻网', '时政', '20201933'),
        ('https://www.chinanews/dxw.shtml', '中国新闻网', '东西问', '20201933'),
        ('https://www.chinanews/world.shtml', '中国新闻网', '国际', '20201933'),
        ('https://www.chinanews/society.shtml', '中国新闻网', '社会', '20201933'),
        ('https://www.chinanews/cj/gd.shtml', '中国新闻网', '财经', '20201933'),
        ('https://www.chinanews/dwq.shtml', '中国新闻网', '大湾区', '20201933'),
        ('https://www.chinanews/huaren.shtml', '中国新闻网', '华人', '20201933'),
        ('https://www.chinanews/wenhua.shtml', '中国新闻网', '文娱', '20201933'),
        ('https://www.chinanews/sports.shtml', '中国新闻网', '体育', '20201933'),
        ('https://www.chinanews/life/gd.shtml', '中国新闻网', '健康生活', '20201933'),
    ]
     def start_requests(self):
        for url in self.start_urls:
            item = NewsdataItem()
            item["site"] = url[1]
            item["item"] = url[2]
            item["student_id"] = url[3]


            yield scrapy.Request(url=url[0], meta={"item": item}, callback=self.parse)

(3)使用xpath提取数据内容

进入网站并进入开发者模式,找到覆盖爬取内容的标签,使用模糊查询进行匹配

  def parse(self, response):
        
        item = response.meta["item"]

        site_ = item["site"]
        item_ = item["item"]
        student_id_ = item["student_id"]

        title_list = response.xpath('//div[@class="content_list"]/ul/li/div/a/text()').extract()
        url_list = response.xpath('//div[@class="content_list"]/ul/li/div/a/@href').extract()
        date_list = response.xpath('//div[@class="dd_time"]/text()').extract()

(4)使用遍历循环进行解析

        for each in range(len(title_list)):
            item = NewsdataItem()
            item["title"] = title_list[each]
            item["url"] = "https://www.chinanews/" + str(url_list[each])
            item["site"] = site_
            item["item"] = item_
            item["student_id"] = student_id_
            item["date"] = date_list[each]

            yield scrapy.Request(url=item["url"], meta={"item": item}, callback=self.parse_detail)

(5)爬取文章正文并写入数据

    def parse_detail(self, response):
        

        item = response.meta["item"]
        strs = response.xpath('//div[@class="left_zw"]').extract_first()
        item["content"] = BeautifulSoup(strs, 'lxml').text
        return item

4.进行爬取

在NewData文件目录下打开命令行输入

scrapy crawl news

5.数据库数据展示

6.补充:自动翻页

(1)有翻页按钮

对于有翻页按钮的网站,我们可以用xpath来定位按钮进行翻页

next_url = response.xpath('//div[@class="page"]/a[last()]/@href').extract_first()
        if next_url:
            next_url = urllib.parse.urljoin(response.url, next_url)
            self.page_link.add(next_url)
            yield scrapy.Request(next_url, meta={"item": item}, callback=self.parse)

xpath定位根据网站内容自行填写
这里的下一页按钮通常是最后一个a标签。

(2)无翻页按钮

对于没有翻页按钮的网站,我们不能通过href来获取下一页的网址,需要手动分析。
一般是网址后的数字变化,那么我们可以通过for循环来实现自动翻页

七.Gerapy分部部署的搭建

1.相关包的安装

安装gerapy

pip install gerapy

安装scrapyd

pip install scrapyd

2.启动项目

(1)初始化

新建文件夹,在该目录下打开目录行输入

gerapy init

(2)数据迁移

新建文件夹中出现gerapy文件夹
进入gerapy文件夹,输入

gerapy migrate

(3)创建超级用户

gerapy initadmin

账号密码均为admin

(4)启动服务

gerapy runserver 0.0.0.0:8000

(5)打开Gerapy

在浏览器中输入http://127.0.0.1:8000/
输入用户密码进入

3.启动scrapyd服务

在anaconda的Scripts文件夹中打开cmd输入scrapyd即可启动

4.创建主机

5.创建项目

将写好的爬虫文件粘贴到gerapy文件夹下的projects中

6.打包部署

7.创建任务

8.任务执行

更多推荐

Zeri9_2022年网络我的网络爬虫学习心得