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 相关文章推荐
Python模块学习 datetime介绍
Aug 27 Python
python写xml文件的操作实例
Oct 05 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
python获取元素在数组中索引号的方法
Jul 15 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
解决python大批量读写.doc文件的问题
May 08 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
python中的句柄操作的方法示例
Jun 20 Python
python定义类self用法实例解析
Jan 22 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
详解python tkinter 图片插入问题
Sep 03 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
php 过滤器实现代码
2010/08/09 PHP
php修改时间格式的代码
2011/05/29 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
浅谈手写node可读流之流动模式
2018/06/01 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
Python的pycurl包用法简介
2015/11/13 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
如何用python免费看美剧
2020/08/11 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
Ever New加拿大官网:彰显女性美
2018/10/05 全球购物
护士的岗位职责
2013/12/04 职场文书
初中地理教学反思
2014/01/11 职场文书
幼儿园教师节活动方案
2014/02/02 职场文书
房地产营销策划方案
2014/02/08 职场文书
校本教研活动总结
2014/07/01 职场文书
学习党史心得体会2016
2016/01/23 职场文书
源码安装apache脚本部署过程详解
2022/09/23 Servers