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中的字符串知识点
Apr 14 Python
Python中返回字典键的值的values()方法使用
May 22 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
微信跳一跳游戏python脚本
Apr 01 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 Python
python机器学习实现决策树
Nov 11 Python
django框架ModelForm组件用法详解
Dec 11 Python
使用python实现飞机大战游戏
Mar 23 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
python实现双人五子棋(终端版)
Dec 30 Python
python 实现逻辑回归
Dec 30 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
Jquery解析json数据详解
2013/12/26 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
Python 字典与字符串的互转实例
2017/01/13 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
Python随机数函数代码实例解析
2020/02/09 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
美国著名手表网站:Timepiece
2017/11/15 全球购物
文秘档案管理岗位职责
2014/03/06 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
工作自我评价范文
2015/03/05 职场文书
教师理论学习心得体会
2016/01/21 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
pandas中关于apply+lambda的应用
2022/02/28 Python