导读:如何使用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" from scrapy.linkextractors import LinkExtractor # 注意转义字符& page_lx = LinkExtractor(allow=('comment.php"htmlcode">#提取匹配 'http://teark.com/article.php"htmlcode">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) returnDownloader 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爬虫框架的资料请关注其它相关文章!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 好薇2024《兵哥哥》1:124K黄金母盘[WAV+CUE]
- 胡歌.2006-珍惜(EP)【步升大风】【FLAC分轨】
- 洪荣宏.2014-拼乎自己看【华特】【WAV+CUE】
- 伊能静.1999-从脆弱到勇敢1987-1996精选2CD【华纳】【WAV+CUE】
- 刘亮鹭《汽车DJ玩主》[WAV+CUE][1.1G]
- 张杰《最接近天堂的地方》天娱传媒[WAV+CUE][1.1G]
- 群星《2022年度发烧天碟》无损黑胶碟 2CD[WAV+CUE][1.4G]
- 罗文1983-罗文甄妮-射雕英雄传(纯银AMCD)[WAV+CUE]
- 群星《亚洲故事香港纯弦》雨果UPMAGCD2024[低速原抓WAV+CUE]
- 群星《经典咏流传》限量1:1母盘直刻[低速原抓WAV+CUE]
- 庾澄庆1993《老实情歌》福茂唱片[WAV+CUE][1G]
- 许巍《在别处》美卡首版[WAV+CUE][1G]
- 林子祥《单手拍掌》华纳香港版[WAV+CUE][1G]
- 郑秀文.1997-我们的主题曲【华纳】【WAV+CUE】
- 群星.2001-生命因爱动听电影原创音乐AVCD【MEDIA】【WAV+CUE】