Python之Scrapy

学python也没两天,看了点基础就直接来搞爬虫了,然后就接触了Scrapy框架
以下是度娘说的
Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
emmm…废话不多说,先介绍下Scrapy吧

ScrapyEngine:这是scrapy框架的核心,处理整个系统的数据流
Scheduler:用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回.
Downloader:用于下载网页内容, 并将网页内容返回
Spiders:爬虫。。
Pipeline:项目管道,处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
Downloader Middlewares:位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
Spider Middlewares:爬虫中间件,处理爬虫的响应输入和请求输出。
Scheduler Middewares:调度中间件,介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

直接实战吧,把我自己的博客列表也就是这个网站https://blog.csdn.net/zFighter,爬出来,后面的内容什么的以后再添加,先通过这个简单的实例了解一下这个框架吧
1.安装scrapy
pip install scrapy
2.创建工程
scrapy startproject myprojectname
3.用IDEA打开这个项目,要注意,Scrapy默认是不能在IDE中调试的,我们在根目录中新建一个py文件叫:entrypoint.py;在里面写入以下内容:

 from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'spider_name'])

这个spider_name就是一会要创建的spider的name,下面会讲到
4.设置数据存储模板
 items.py
 

class Blog(scrapy.Item):
    # 地址
    blogUrl = scrapy.Field()
    # 标题
    blogTitle = scrapy.Field()
    # 作者
    author = scrapy.Field()
    # 摘要
    blogAbstract = scrapy.Field()

注意一定要继承scrapy.Item 一定要继承scrapy.Item 一定要继承scrapy.Item
5.在spiders文件夹中编写自己的爬虫
新建csdn_spider.py

import scrapy
from scrapy.http import Request
from bs4 import BeautifulSoup
from tutorial.items import Blog


class Csdn(scrapy.spiders.Spider):
    name = "csdn"
    allowed_domains = ['csdn.net']
    bashurl = 'https://blog.csdn.net/zFighter'

    def start_requests(self):
        yield Request('https://blog.csdn.net/zFighter', self.parse)

    def parse(self, response):

        # 获取文章列表
        uls = BeautifulSoup(response.text, 'lxml').find_all('div',
                                                            {'class': 'article-item-box csdn-tracking-statistics'})
        for ul in uls:
            blog_name = ul.find('h4', {'class', 'text-truncate'}).find('a').get_text().strip()
            blog_url = ul.find('a')['href']
            blogAbstract = ul.find('p', {'class': 'content'}).find('a').get_text().strip()
            author = 'zhj'
            item = Blog()
            item['blogUrl'] = str(blog_url).replace('\xa0', '')
            item['blogTitle'] = str(blog_name).replace('\n', '')
            item['blogAbstract'] = str(blogAbstract).replace('/', '')
            item['author'] = str(author).replace('/', '')
            yield item

6.编写piperlines

from tutorial.items import Blog

class DmozItemPipeline(object):

def process_item(self, item, spider):
      if isinstance(item,Blog):
            blogUrl=item['blogUrl']
            ret = Sql.selectBlogbyUrl(blogUrl)
            if ret[0] == 1:
                print('已经存在了')
                pass
            else:
                 blogTitle=item['blogTitle']
                 author=item['author']
                 blogAbstract=item['blogAbstract']
                 Sql.insert_blog(blogUrl,blogTitle,blogAbstract,author)
            print('文章存储完毕')

7.在settings中添加
ITEM_PIPELINES = {
‘tutorial.mysqlpipelines.pipelines.DmozItemPipeline’: 1
}
8.编写sql.py

import mysql.connector
from tutorial import settings

MYSQL_HOSTS = settings.MYSQL_HOSTS
MYSQL_USER = settings.MYSQL_USER
MYSQL_PASSWORD = settings.MYSQL_PASSWORD
MYSQL_PORT = settings.MYSQL_PORT
MYSQL_DB = settings.MYSQL_DB

cnx = mysql.connector.connect(user=MYSQL_USER, password=MYSQL_PASSWORD, host=MYSQL_HOSTS, database=MYSQL_DB)
cur = cnx.cursor(buffered=True)

class Sql:
 @classmethod
    def insert_blog(cls,blogUrl,blogTitle,blogAbstract,author):
       # sql="INSERT INTO blog (`blogUrl`,`blogTitle`,`author`,`blogAbstract`) VALUES (%(blogUrl)s,%(blogTitle)s,%(author)s,%(blogAbstract)s)"
        sql="INSERT INTO blog (`blogUrl`,`blogTitle`,`author`,`blogAbstract`) VALUES (%s,%s,%s,%s)"

        value={
            'blogUrl':blogUrl,
            'blogTitle':blogTitle,
            'blogAbstract':blogAbstract,
            'author':author
        }
        try:
         cur.execute(sql,(blogUrl,blogTitle,blogAbstract,author))
         cnx.commit()
        except Exception as e:
         print(Exception,":",e)

当然别忘了在settings中配置一下mysql啊


MYSQL_HOSTS = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_PASSWORD = 'root'
MYSQL_PORT = '3306'
MYSQL_DB = 'python'

建表的过程就不赘述了
看运行效果


当然还有很多功能没有实现,比如还没有爬内容和图片,还有分页的查询,这里的分页是js动态的,后面会继续更新的
附上github地址
https://github.com/Confidenceme/tutorial

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值