Python Scrapy

什么是爬虫?

网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。

Python 爬虫

在爬虫领域,Python几乎是霸主地位,将网络一切数据作为资源,通过自动化程序进行有针对性的数据采集以及处理。从事该领域应学习爬虫策略、高性能异步IO、分布式爬虫等,并针对Scrapy框架源码进行深入剖析,从而理解其原理并实现自定义爬虫框架。

Python 爬虫爬虫框架 Scrapy

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

Python Scrapy 核心

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

**Scheduler(调度器): **它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).

Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

Scrapy Demo

# 创建爬虫虚拟环境
$ conda create --name scrapy python=3.6 # 激活虚拟环境
$ activate scrapy # 安装scrapy
$ conda install scrapy # 使用 scrapy 提供的工具创建爬虫项目
$ scrapy startproject myScrapy # 启动爬虫
$ scrapy crawl scrapyName

项目文件介绍

  • scrapy.cfg: 项目的配置文件。

  • mySpider/: 项目的Python模块,将会从这里引用代码。

  • mySpider/items.py: 项目的目标文件。

  • mySpider/pipelines.py: 项目的管道文件。

  • mySpider/settings.py: 项目的设置文件。

  • mySpider/spiders/: 存储爬虫代码目录。

爬取豆瓣 top250

  • item.py
import scrapy

class DoubanItem(scrapy.Item):
name = scrapy.Field()
director = scrapy.Field()
detail = scrapy.Field()
star = scrapy.Field()
synopsis = scrapy.Field()
comment = scrapy.Field()
  • spiders/DoubanSpider.py
# coding:utf-8

import scrapy
from scrapy import Request from douban.items import DoubanItem class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ['douban.com']
start_urls = ['https://movie.douban.com/top250'] def parse(self, response):
movie_list = response.xpath("//div[@class='article']/ol/li")
if movie_list and len(movie_list) > 0:
for movie in movie_list:
item = DoubanItem()
item['name'] = movie.xpath("./div/div[2]/div[1]/a/span[1]/text()").extract()[0]
item['director'] = movie.xpath("normalize-space(./div/div[2]/div[2]/p/text())").extract_first()
item['detail'] = movie.xpath("normalize-space(./div/div[2]/div[2]/p[1]/text())").extract()[0]
item['star'] = movie.xpath("./div/div[2]/div[2]/div/span[2]/text()").extract()[0]
item['synopsis'] = movie.xpath("normalize-space(./div/div[2]/div[2]/p[2]/span/text())").extract()[0]
item['comment'] = movie.xpath("./div/div[2]/div[2]/div/span[4]/text()").extract()[0]
yield item next_link = response.xpath("//span[@class='next']/a/@href").extract()
if next_link:
yield Request("https://movie.douban.com/top250" + next_link[0], callback=self.parse, dont_filter=True)
  • pipelines.py
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from database_handler import DatabaseHandler class DoubanPipeline(object):
def __init__(self):
self.db = DatabaseHandler(host="xxx", username="xxx", password="xxx", database="xxx") def close_spider(self, spider):
self.db.close() # 将 Item 实例保存到文件
def process_item(self, item, spider):
sql = "insert into t_douban(name,director,detail,star,synopsis,comment) values('%s', '%s', '%s', '%s', '%s', '%s')" % (
item['name'], item['director'], item['detail'], item['star'], item['synopsis'], item['comment'])
self.db.insert(sql)
return item
  • DatabaseHandler.py
# coding:utf-8

import pymysql
from pymysql.err import * class DatabaseHandler(object):
def __init__(self, host, username, password, database, port=3306):
"""初始化数据库连接"""
self.host = host
self.username = username
self.password = password
self.port = port
self.database = database
self.db = pymysql.connect(self.host, self.username, self.password, self.database, self.port, charset='utf8')
self.cursor = None def execute(self, sql):
"""执行SQL语句"""
try:
self.cursor = self.db.cursor()
self.cursor.execute(sql)
self.db.commit()
except (MySQLError, ProgrammingError) as e:
print(e)
self.db.rollback()
else:
print("rowCount: %s rowNumber: %s" % (self.cursor.rowcount, self.cursor.rownumber))
finally:
self.cursor.close() def update(self, sql):
""" 更新操作"""
self.execute(sql) def insert(self, sql):
"""插入数据"""
self.execute(sql)
return self.cursor.lastrowid def insert_bath(self, sql, rows):
"""批量插入"""
try:
self.cursor.executemany(sql, rows)
self.db.commit()
except (MySQLError, ProgrammingError) as e:
print(e)
self.db.rollback()
else:
print("rowCount: %s rowNumber: %s" % (self.cursor.rowcount, self.cursor.rownumber))
finally:
self.cursor.close() def delete(self, sql):
"""删除数据"""
self.execute(sql) def select(self, sql):
"""查询数据 返回 map 类型的数据"""
self.cursor = self.db.cursor(cursor=pymysql.cursors.DictCursor)
result = []
try:
self.cursor.execute(sql)
data = self.cursor.fetchall()
for row in data:
result.append(row)
except MySQLError as e:
print(e)
else:
print(f"rowCount: {self.cursor.rowcount} rowNumber: {self.cursor.rownumber}")
return result
finally:
self.cursor.close() def call_proc(self, name):
"""调用存储过程"""
self.cursor.callproc(name)
return self.cursor.fetchone() def close(self):
"""关闭连接"""
self.db.close() if __name__ == "__main__":
pass
  • 修改settings.py
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

ITEM_PIPELINES = {
'mySpider.pipelines.DoubanPipeline': 300,
}

run

scrapy crawl douban

Python Scrapy 实战的更多相关文章

  1. 教程+资源,python scrapy实战爬取知乎最性感妹子的爆照合集(12G)!

    一.出发点: 之前在知乎看到一位大牛(二胖)写的一篇文章:python爬取知乎最受欢迎的妹子(大概题目是这个,具体记不清了),但是这位二胖哥没有给出源码,而我也没用过python,正好顺便学一学,所以 ...

  2. python scrapy实战糗事百科保存到json文件里

    编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...

  3. python scrapy 实战简书网站保存数据到mysql

    1:创建项目 2:创建爬虫 3:编写start.py文件用于运行爬虫程序 # -*- coding:utf-8 -*- #作者: baikai #创建时间: 2018/12/14 14:09 #文件: ...

  4. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  5. Python分布式爬虫开发搜索引擎 Scrapy实战视频教程

    点击了解更多Python课程>>> Python分布式爬虫开发搜索引擎 Scrapy实战视频教程 课程目录 |--第01集 教程推介 98.23MB |--第02集 windows下 ...

  6. python爬虫实战——5分钟做个图片自动下载器

      python爬虫实战——图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要, ...

  7. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  8. 《精通Python网络爬虫》|百度网盘免费下载|Python爬虫实战

    <精通Python网络爬虫>|百度网盘免费下载|Python爬虫实战 提取码:7wr5 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...

  9. python scrapy版 极客学院爬虫V2

    python scrapy版 极客学院爬虫V2 1 基本技术 使用scrapy 2 这个爬虫的难点是 Request中的headers和cookies 尝试过好多次才成功(模拟登录),否则只能抓免费课 ...

随机推荐

  1. Flutter 目录结构介绍、入口、自定义 Widget、MaterialApp 组件、Scaffold 组件

    Flutter 目录结构介绍 文件夹 作用 android android 平台相关代码 ios ios 平台相关代码 lib flutter 相关代码,我们主要编写的代 码就在这个文件夹 test ...

  2. 利用OpenGL固定流水线绘制球体

    在OS X上的一个OpenGL简单demo.所附赠的代码是绘制半个球体.开启了深度缓存和多重采样,采样数是4. 详细下载地址请见:http://www.cocoachina.com/bbs/read. ...

  3. javascript取模运算是怎么算的?其实是取余数

    问到是否整除,这里记录下取模 比如120分钟是不是整点?120%60 === 0 为整点 javascript取模运算是一个表达式的值除以另一个表达式的值,并返回余数. 取模在js里就是取余数的意思. ...

  4. 002-06-RestTemplate-请求示例-form、json、multipart、okhttp3

    一.概述 请求示例集合 服务端:https://github.com/bjlhx15/common-study.git 中的 http-client-webserver 服务端:RequestBody ...

  5. TCP和TLS/SSL会话细节

    TCP数据段格式说明TCP建立连接和断开连接细节Https如何保证通信安全一次Https网络请求通信细节网络数据包分析工具wireshark的使用问题:SYN.ACK.FIN具体含义是什么?TCP建立 ...

  6. React错误收集

    1.  Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/ ...

  7. iOS 不允许横屏的简单代码

    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWi ...

  8. Day1作业1:登陆接口(加入日志、注册功能)

    流程图如下: 最先考虑使用python中的list,以能取到user_list中的用户信息,但中途发现没有比较好的方法截取取密码,还是新手的缘故,最终选择了使用dict,以方便截取用户名以及相应的密码 ...

  9. 通过pathinfo返回扩展名

    strtolower(pathinfo(abs.php,PATHINFO_EXTENSION)); 小写 通过pathinfo返回扩展名 pathinfo() 函数以数组的形式返回文件路径的信息. p ...

  10. 对ThreadLocal的理解

      参考文档:https://www.cnblogs.com/moonandstar08/p/4912673.html   一.定义:线程本地变量,每个线程中的变量相互独立,互不影响. 官方定义: 1 ...