python Scrapy爬虫框架的使用


Posted in Python onJanuary 21, 2021

导读:如何使用scrapy框架实现爬虫的4步曲?什么是CrawSpider模板?如何设置下载中间件?如何实现Scrapyd远程部署和监控?想要了解更多,下面让我们来看一下如何具体实现吧!

Scrapy安装(mac)

pip install scrapy

注意:不要使用commandlinetools自带的python进行安装,不然可能报架构错误;用brew下载的python进行安装。

Scrapy实现爬虫

新建爬虫

scrapy startproject demoSpider,demoSpider为项目名。

确定目标

编写items.py,如添加目标字段:person = scrapy.Field()

制作爬虫

scrapy genspider demo "baidu.com",创建demo爬虫文件,指定爬取域。

修改demo.py里的start_urls的地址为自己想爬取的地址如:https://www.cnblogs.com/teark/

随意修改parse()方法,如保存所爬取的页面,可以这样:

def parse(self, response):
  with open("teark.html", "w") as f:
    f.write(response.text)

运行爬虫,看看效果:scrapy crawl demo

有了保存的页面后(可注释掉或删掉保存页面的代码),根据页面结构提取所需数据,一般用xpath表达式,如:

def parse(self, response):
  for _ in response.xpath("//div[@class='teark_article']"):
    item = ItcastItem()
    title = each.xpath("h3/text()").extract()
    content = each.xpath("p/text()").extract()
    item['title'] = title[0]
    item['content'] = content[0]
    yield item

保存数据:scrapy crawl demo -o demo.json(以下格式都行:jsonl,jsonl,csv,xml)

注:该过程在取值中经常需要页面调试,使用scrapy shell(最好先安装ipython,有语法提示),调试好了再放到代码里,如:

scrapy shell "https://www.cnblogs.com/teark/"
response.xpath('//*[@class="even"]')
print site[0].xpath('./td[2]/text()').extract()[0]

处理内容

pipline常用来存储内容,pipline.py中必须实现process_item()方法,该方法必须返回Item对象,如:

import json

class ItcastJsonPipeline(object):

  def __init__(self):
    self.file = open('demo.json', 'wb')

  def process_item(self, item, spider):
    content = json.dumps(dict(item), ensure_ascii=False) + "\n"
    self.file.write(content)
    return item

  def close_spider(self, spider):
    self.file.close()

在settings.py中添加ITEM_PIPELINES配置,如:

ITEM_PIPELINES = {
  "demoSpider.pipelines.DemoJsonPipeline":300
}

重新启动爬虫:scrapy crawl demo,看看当前目录是否生成demo.json

CrawlSpiders

CrawlSpider是spider的派生类,为了从爬取的网页中获取link并继续爬取。

快速创建 CrawlSpider模板:scrapy genspider -t crawl baidu baidu.com

Rule类制定了爬取规则;LinkExtractors类为了提取链接,如:

scrapy shell "http://teark.com/article.php?&start=0#a"

from scrapy.linkextractors import LinkExtractor

# 注意转义字符&
page_lx = LinkExtractor(allow=('comment.php?\&start=\d+'))
page_lx.extract_links(response)

测试完后就知道了allow和rules了,修改spider代码:

#提取匹配 'http://teark.com/article.php?&start=\d+'的链接
page_lx = LinkExtractor(allow = ('start=\d+'))

rules = [
  #提取匹配,并使用spider的parse方法进行分析;并跟进链接(没有callback意味着follow默认为True)
  Rule(page_lx, callback = 'parseContent', follow = True)
]

注:callback 千万不能写 'parse'

Logging

添加日志功能:settings.py中添加如下:

LOG_FILE = "DemoSpider.log"

# 还有CRITICAL, ERROR, WARNING DEBUG等级别
LOG_LEVEL = "INFO"

FormRequest

该方法用来发送POST请求,在spider.py中如下:

def start_requests(self):
    url = 'http://www.renren.com/PLogin.do'
    yield scrapy.FormRequest(
      url = url,
      formdata = {"email" : "teark@9133***34.com", "password" : "**teark**"},
      callback = self.parse_page
    )

模拟登陆:

import scrapy

class LoginSpider(scrapy.Spider):
  name = 'demo.com'
  start_urls = ['http://www.demo.com/users/login.php']


  def parse(self, response):
    return scrapy.FormRequest.from_response(
      response,
      formdata={'username': 'teark', 'password': '***'},
      callback=self.after_login
    )

  def after_login(self, response):
    # 检查登陆成功还是失败
    if "authentication failed" in response.body:
      self.log("Login failed", level=log.ERROR)
      return

Downloader Middlewares

防止爬虫被反策略

设置随机User-Agent

禁用Cookies,可以通过COOKIES_ENABLED 控制 CookiesMiddleware 开启或关闭

设置延迟下载降低频率

使用谷歌/百度等搜索引擎服务器页面缓存获取页面数据

使用IP地址池——VPN和代理IP

使用cralera(专用于爬虫的代理组件),配置中间件后请求都是通过crawlera发出的

设置下载中间件——Downloader Middlewares

键为中间件类的路径,值为其中间件的顺序(order)

DOWNLOADER_MIDDLEWARES = {
  'mySpider.middlewares.MyDownloaderMiddleware': 543,
}

当请求通过下载中间件时,process_request方法被调用;当下载中间件完成请求后传递响应给引擎时process_response方法被调用。

在settings.py同级目录下创建middlewares.py文件,如:

import random
import base64
from settings import USER_AGENTS
from settings import PROXIES


class RandomUserAgent(object):
  def process_request(self, request, spider):
    useragent = random.choice(USER_AGENTS)
    request.headers.setdefault("User-Agent", useragent)

class RandomProxy(object):
  def process_request(self, request, spider):
    proxy = random.choice(PROXIES)
    if proxy['user_passwd'] is None:
      request.meta['proxy'] = "http://" + proxy['ip_port']
    else:
      base64_userpasswd = base64.b64encode(proxy['user_passwd'])
      request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswd
      request.meta['proxy'] = "http://" + proxy['ip_port']

与代理服务器连接需要使用base64编码,如果有需要身份验证的话还需要加上授权信息,

修改settings.py配置USER_AGENTS和PROXIES

免费代理IP上网搜,或购买可用的私密代理IP

USER_AGENTS = ["Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
  "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
  ]

PROXIES = [
{'ip_port': '111.8.60.9:8123', 'user_passwd': 'user1:pass1'},

{'ip_port': '101.71.27.120:80', 'user_passwd': 'user2:pass2'},

{'ip_port': '122.96.59.104:80', 'user_passwd': 'user3:pass3'},

]

# 禁用cookies
COOKIES_ENABLED = False

# 设置下载延迟
DOWNLOAD_DELAY = 3

# 添加自己编写的下载中间件
DOWNLOADER_MIDDLEWARES = {
  #'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,
  'mySpider.middlewares.RandomUserAgent': 1,
  'mySpider.middlewares.ProxyMiddleware': 100
}

Scrapyd - 爬虫的远程部署和监控

安装Scrapyd

sudo pip install scrapyd
sudo pip install scrapyd-client

修改scrapyd的配置文件

启用scrapyd配置,在deploy后面指定当前项目的Scrapyd配置名,配置Scrapyd服务的ip和port,以及当前项目的项目名,如:

sudo vi /usr/local/lib/python3.8.6/site-packages/scrapyd/default_scrapyd.conf
# scrapy项目的settings文件位置,不用改动
[settings]
default = Demo.settings

# Scrapyd_Tencent是配置名
[deploy:Scrapyd_Demo]    

# 若是本机Scrapyd服务部署,则使用localhost即可否则使用服务主机的ip
url = http://localhost:6800/  

# 需要部署和监控的Scrapy项目名
project = Demo

通过Scrapyd客户端工具挂载项目

指令:scrapyd-deploy Scrapyd_Demo -p Demo

scrapyd-deploy 是客户端命令,参数是 Scrapyd配置名,以及 -p 指定项目名

远程部署和停止爬虫

部署:curl http://localhost:6800/schedule.json -d project=Demo -d spider=demo

停止:curl http://localhost:6800/cancel.json -d project=Demo -d job=iundsw....

注:爬虫启动成功后,会生成job值,停止爬虫时需要通过job值停止。

以上就是python Scrapy爬虫框架的使用的详细内容,更多关于python Scrapy爬虫框架的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
pandas数据处理进阶详解
Oct 11 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
python实现数字炸弹游戏
Jul 17 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 Python
Pygame Event事件模块的详细示例
Nov 17 Python
python 可视化库PyG2Plot的使用
Jan 21 #Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 #Python
Python实现石头剪刀布游戏
Jan 20 #Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 #Python
python3中celery异步框架简单使用+守护进程方式启动
Jan 20 #Python
Django+Django-Celery+Celery的整合实战
Jan 20 #Python
详解Python Celery和RabbitMQ实战教程
Jan 20 #Python
You might like
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
PHP分页函数代码(简单实用型)
2010/12/02 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
快速创建python 虚拟环境
2020/11/28 Python
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
影视制作岗位职责
2013/12/04 职场文书
心得体会怎么写
2013/12/30 职场文书
上海世博会口号
2014/06/19 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android
Nginx报404错误的详细解决方法
2022/07/23 Servers