前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【趣学程序】python之scrapy爬虫

【趣学程序】python之scrapy爬虫

作者头像
趣学程序-shaofeer
发布2019-10-24 16:33:13
5160
发布2019-10-24 16:33:13
举报
文章被收录于专栏:upuptop的专栏upuptop的专栏

初识python_scrapy爬虫

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.

当前教程默认读者已安装python环境

安装scrapy

代码语言:javascript
复制
pip install Scrapy

创建爬虫项目

通过命令方式进行创建爬虫项目

代码语言:javascript
复制
scrapy startproject studyscrapypro

项目结构

spiders:项目中的模块,通常在该模块下编写python代码,爬虫的逻辑代码等。items.py:项目中用到的实体类,需要开发者自己定义。pipelines.py:处理爬虫爬到的数据,数据处理器。settings.py:项目的配置文件,在该文件中可以对项目进行基本的设置。scrapy.cfg:项目的顶级配置文件,基本上无需默认修改。

Scrapy的开发步骤

  1. 创建项目
  2. 编写item实体类
  3. 创建爬虫类(Spider) 编写爬虫的逻辑
  4. 编写爬虫结果数据处理类(Pipeline)
  5. 启动项目

当前案例以爬取博客数据为例

目标网址: https://www.cnblogs.com/

需求:获取首页的博客数据。

定义博客item类

代码语言:javascript
复制
import scrapy
class StudyscrapyproItem(scrapy.Item):
 #当前类继承scrapy.Item
 # define the fields for your item here like:
 # name = scrapy.Field()
    title = scrapy.Field()
    author = scrapy.Field()
    comm = scrapy.Field()
    scan = scrapy.Field()
    desc = scrapy.Field()
    date = scrapy.Field()

使用通用模板创建Spider爬虫类

代码语言:javascript
复制
scrapy genspider cn_blogs_splider "www.cnblogs.com"

我们会在spiders文件夹中看到我们新创建的类 cnblogssplider

编写爬虫逻辑

自定义的Spider继承scrapy.Spider类,name属性必须有且唯一不重复。alloweddomains定义了被爬取的网站域名 实现了其parse方法。response参数就是scrapy请求网络返回的数据。通过编写parse方法实现提取数据的过程,这里使用到了xpath语法。也可以使用正则表达式进行匹配。推荐使用Xpath语法。XPATH语法学习推荐:https://www.w3school.com.cn/xpath/xpathsyntax.asp

代码语言:javascript
复制
import scrapy
from studyscrapypro.items import StudyscrapyproItem
class CnBlogsSpliderSpider(scrapy.Spider):
    name = \\'cn_blogs_splider\\'
    allowed_domains = [\\'www.cnblogs.com\\']
    start_urls = [\\'http://www.cnblogs.com/\\']
 def parse(self, response):
        post_list = response.xpath("//div[@class=\\'post_item\\']")
 for post in post_list:
            title = post.xpath(".//a[@class=\\'titlelnk\\']/text()").extract_first()
            author = post.xpath(".//a[@class=\\'lightblue\\']/text()").extract_first()
            comm_scan = post.xpath(".//a[@class=\\'gray\\']/text()").getall()
            comm = int(str(comm_scan[0]).strip()[3:-1])
            scan = int(str(comm_scan[1]).strip()[3:-1])
            date_str = post.xpath(".//div[@class=\\'post_item_foot\\']/text()").getall()
            date_str = str(date_str[1]).strip()[4:]
 # date = time.strptime(date_str, "%Y-%m-%d %H:%M")
            all_desc = post.xpath(".//p[@class=\\'post_item_summary\\']/text()").getall()
 if len(all_desc) < 2:
 continue
            desc = str(all_desc[1]).strip()
            item = StudyscrapyproItem()
            item["title"] = title
            item["author"] = author
            item["comm"] = comm
            item["scan"] = scan
            item["desc"] = desc
            item["date"] = date_str
 yield item

编写最终处理数据的类(Pipeline)

这里示例转为json存文件,存数据库方式 安装MySQL模块

代码语言:javascript
复制
pip install mysql

数据库表

代码语言:javascript
复制
CREATE TABLE `item` (  `id` int(10) NOT NULL AUTO_INCREMENT,  `title` char(100) DEFAULT NULL,  `desc` char(100) DEFAULT NULL,  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `author` char(20) DEFAULT NULL,  `comm` int(10) DEFAULT NULL,  `scan` int(10) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=588 DEFAULT CHARSET=utf8mb4

Pipeline.py

代码语言:javascript
复制
import MySQLdb
import json
class StudyscrapyproPipeline(object):
 # 初始化方法
 def __init__(self):
 self.connect = MySQLdb.connect(host=\\'localhost\\', port=3306, user=\\'root\\', passwd=\\'root\\', db=\\'cn_blog\\',
                                       charset=\\'utf8\\')
 self.connect.autocommit(on=False)
 self.cursor = self.connect.cursor()
 pass
 # self.file = open("result.json", \\'w+\\')
 # self.file.write(\\'[\\')
 def write_item(self, item):
        json_str = json.dumps(dict(item))
 self.file.write(json_str + ",\n")
 print(json_str)
 pass
 def insert_mysql(self, item):
 # self.cursor.execute("""
 # INSERT INTO `cn_blog`.`item` (`title`,`desc`,`author`, `comm`,`scan`)VALUES(%s,%s,%s,%s,%s);
 # """, (item[\\'title\\'], \\'desc\\', \\'author\\', 1, 1))
 self.cursor.execute("""
            INSERT INTO `cn_blog`.`item` (`title`,`desc`,`author`, `comm`,`scan`,`date`)VALUES(%s,%s,%s,%s,%s,%s);
            """, (item[\\'title\\'], item[\\'desc\\'][0:100], item[\\'author\\'], item[\\'comm\\'], item[\\'scan\\'], item[\\'date\\']))
 # 解析的方法
 def process_item(self, item, spider):
 # self.write_item(item)
 self.insert_mysql(item)
 return item
 # 关闭的方法 善后
 def close_spider(self, spider):
 # self.file.write("]")
 # self.file.close()
 self.connect.commit()
 self.cursor.close()
 self.connect.close()

修改配置文件settings.py

代码语言:javascript
复制
# 关闭遵循目标网站提供的防爬虫文件
ROBOTSTXT_OBEY = False
# 添加User-Agent
DEFAULT_REQUEST_HEADERS = {
 \\'Accept\\': \\'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\',
 \\'User-Agent\\':\\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36\\',
 # \\'Accept-Language\\': \\'en\\',
}
#开启Pipelines处理数据
ITEM_PIPELINES = {
 \\'studyscrapypro.pipelines.StudyscrapyproPipeline\\': 300,
}

项目源码

https://github.com/upuptop/studyscrapypro

官方文档:

https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣学程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初识python_scrapy爬虫
    • 安装scrapy
      • 创建爬虫项目
        • 项目结构
          • Scrapy的开发步骤
            • 当前案例以爬取博客数据为例
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档